Java 为什么(i<;=j&;j<;=i&;i!=j)的计算结果为真?

Java 为什么(i<;=j&;j<;=i&;i!=j)的计算结果为真?,java,Java,我已经编写了一段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){ Sy

我已经编写了一段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);
        }
    }
}
公共类测试程序{
公共静态void main(字符串[]args){
整数i=新整数(0);
整数j=新整数(0);

而(iinteger对象是不同的,它不同于基本的int类型

看看这个答案:


i!=j
部分为true,您希望为false。

循环没有结束,因为您的条件为true(i!=j为true,因为有两个不同的对象,请改用Integer.valueOf),而在循环内,值没有改变,因此您的条件永远为true。

    < > >代码> i < P>也许原因是“i”和“j”都是对象,对象比较与对象引用比较是不一样的。请考虑使用.I.等量(j)而不是i!= j

    ,因为您在比较

    • 0<=0(真)//取消装箱

    • 0>=0(真)//取消装箱

    • reference!=secondReference(true)
      当您创建对象时,不是原始比较。因此它的计算结果为
      while(true){//永无止境循环}


    程序一直显示相同的
    i
    值,因为你没有增加或减少
    i
    j
    的值。for中的条件总是求值为true,因此它是一个无限循环。

    你必须知道这和这两个值有点不同&当你使用&&then whe时n第一个条件为真,则它检查第二个条件,如果为假,则它不检查第三个条件,因为in&运算符如果一个条件为假,则所有语句都为假,如果使用| |则如果它为真,则它在代码中返回真,因为i和j相等第一个条件为真,第二个条件为真,则在第三个条件中它将为假因为它们相等,而条件为false。

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

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

    =比较将使用未绑定的值0,而!=将比较引用并将成功,因为它们是不同的对象

    即使这样也会起作用

    整数a=1000;整数b=1000

    但这并不是:

    整数a=100;整数b=100

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


    为了更好地理解,请查看url:

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

    案例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);
    
    整数i=新整数(10);
    整数j=新整数(10);
    
    System.out.println((简单的答案是
    你创建整数的方式是不正确的。如果你从未改变
    i
    j
    ,那么你希望循环什么时候终止?@PradeepSimha对于简单的int值,这总是会产生false。撇开
    不谈,这是《Java难题:陷阱、陷阱和Cor》一书中的难题32ner案例。虽然为真,但在这里也不重要,也不回答问题。@Kon:事实上这就是答案。条件#1和#2由于自动装箱而计算为
    true
    。如果为#3,则自动装箱不适用,并在对象(内存位置)上进行比较level.你能解释一下,为什么!=正在检查引用对象的内存索引,@punitraj<&>运算符在基本体上工作,而不是在对象上工作,因此这些运算符会自动取消装箱。但是==和!=运算符也可以用于对象比较,因此不需要在这里取消装箱,因此会比较对象。啊,隐藏的隐式装箱/拆箱的危险!!堆栈溢出只需添加一个新标记,“自动拆箱是Java中有史以来最大的错误”。:)。除了Java拼图书的作者之外。使用它来标记类似的问题。注意
    Integer.valueOf(0)=Integer.valueOf(0)
    始终计算为true,因为在这种情况下返回相同的对象(请参见IntegerCache)我想问题更多的是关于
    I!=j
    部分,该部分的计算结果令人惊讶地为真,而不是
    Ohh!自动拆箱的隐藏龙…很好的解释。我不知道为什么我的答案会得到mines值,因为我的答案是真的,请查看此链接,然后在得到mines之前阅读更多信息
    
            Integer i = 10;
            Integer j = 10;
    
            System.out.println((i<=j && j<=i && i==j));
            System.out.println(i==j);