Java 为什么(i<;=j&;j<;=i&;i!=j)的计算结果为真?
我已经编写了一段Java代码,它在一个无限循环中运行 代码如下: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
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);