105

我编写了一段在无限循环中运行的 Java 代码。

下面是代码:

public class TestProgram {
    public static void main(String[] args){
        Integer i = new Integer(0);
        Integer j = new Integer(0);

        while(i<=j && j<=i && i!=j){
            System.out.println(i);
        }
    }
}

在上面的代码中,当看到while循环中的条件时,起初看起来该程序不会进入while循环。但实际上它是一个无限循环并不断打印该值。

这里发生了什么?

4

10 回答 10

189
  • i <= j被评估为true,因为自动拆箱发生在 int 比较中,然后两者都i保持j默认值,0.

  • j <= itrue由于上述原因,被评估为。

  • i != j被评估为true,因为ij都是不同的对象。在比较对象时,不需要自动拆箱。

所有条件都为真,并且您没有更改i并且j处于循环状态,因此它无限运行。

于 2013-09-14T17:46:26.397 回答
41

因为你在比较

  • 0 < = 0 (true) // unboxing

  • 0 > = 0 (true) // unboxing

  • reference != secondReference (true)当您创建对象时,而不是原始比较。所以它评估为while(true) { // Never ending loop }

于 2013-09-14T17:47:12.320 回答
17

整数对象是不同的。它不同于基本的 int 类型。

请参阅此答案:如何正确比较 Java 中的两个整数?

i != j部分是真的,你期望它是假的。

于 2013-09-14T17:45:19.253 回答
2

我们必须首先了解两种不同的情况,

情况1:

        Integer i = new Integer(10);
        Integer j = new Integer(10);

        System.out.println((i<=j && j<=i && i!=j));
        System.out.println(i!=j);

案例2:

        Integer i = 10;
        Integer j = 10;

        System.out.println((i<=j && j<=i && i==j));
        System.out.println(i==j);

两者都是不同的,因为

情况1:i!=j将是true因为两者都引用堆中的两个不同对象并且不能相同。但

在情况 2:i==j将是true因为 10 都是整数文字并且 Java 维护pool for Integer literals它们具有 value (-128 <= X <= 127)。所以,在这种情况下 10<=127 结果为真,所以两者都将引用同一个对象。

于 2014-02-23T19:20:59.130 回答
1

循环没有结束,因为您的条件为真( i != j 为真,因为有 2 个不同的对象,请使用 Integer.valueOf 代替)并且在循环内值没有改变,因此您的条件永远保持为真。

于 2013-09-14T17:46:11.653 回答
1

可能原因是 'i' 和 'j' 都是对象,对象比较与对象引用比较不同。请考虑使用 !i.equals(j) 而不是 i!=j

于 2013-09-14T17:47:00.553 回答
1

整数对象是不同的。它不同于基本的 int 类型。所以你可以这样做。你所做的只是比较对象,当然结果是正确的。

于 2013-09-27T04:16:53.143 回答
1

整数 a = 新整数(0);整数 b = 新整数(0);

<= 和 >= 比较将使用未装箱的值 0,而 != 将比较引用并成功,因为它们是不同的对象。

即使这也可以工作,即

整数 a = 1000;整数 b = 1000;

但这没有:

整数 a = 100;整数 b = 100;

原因是因为 Integer 在内部对 -128 到 127 之间的 Integer 对象使用缓存,并从该缓存中返回其覆盖范围内的实例。我不确定,但我猜你也可以在包“java.lang.Integer.IntegerCache.high”中更改它的最大值。

为了更好地理解检查网址:https ://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching

于 2013-09-27T09:59:00.537 回答
0

程序继续显示相同的值,i因为您没有增加或减少 或 的ij。for 中的条件始终保持为真,因此它是一个无限循环。

于 2013-09-15T02:19:43.277 回答
-3

你必须知道它在 && this 和 this & 中有点不同,当你使用 && 然后当第一个条件为真时,它检查第二个条件是否为假,然后它不检查第三个条件,因为在 & 运算符中,如果一个条件为假,所有如果使用 || 则声明为假 然后如果它看到 true 那么它在您的代码中返回 true 因为 i 和 j 相等,第一个条件和第二个条件为 true 然后在第三个条件下它将为 false 因为它们相等并且 while 条件为 false 。

于 2013-09-20T05:32:59.133 回答