为什么(i <= j && j <= i && i!= j)评估为TRUE?

问题

我编写了一段在无限循环中运行的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);
        }
    }
}

在上面的代码中,当看到2772334760loop中的条件时,首先看起来该程序不会进入whileloop。但实际上它是一个无限循环并保持打印价值。

这里发生了什么?


#1 热门回答(188 赞)

  • i <= j被评估为true,因为对于int比较会发生自动拆箱,然后i和j都保持默认值0。
  • 由于上述原因,j <= i被评估为真。
  • i!= j被评估为真,因为i和j都是不同的对象。在比较对象时,不需要自动拆箱。

所有条件都是正确的,并且你没有在循环中更改i和331106801,因此它无限运行。


#2 热门回答(40 赞)

因为你在比较

  • 0 <= 0(真)//取消装箱
  • 0> = 0(true)//取消装箱
  • reference!= secondReference(true),因为你正在创建对象,而不是原始比较。所以它评估为while(true){//永不结束循环}。

#3 热门回答(17 赞)

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

看到这个答案:How to properly compare two Integers in Java?

Thei != jpart是真的,你期望它是假的。