2015-06-30 137 views
2
Integer i = new Integer(0); 
Integer j = new Integer(0); 
while(i <= j && j <= i && i !=j){ 
    System.out.println(i); 
} 

为什么这个while循环执行? 我明白i != j。但是分别地,i <= jj <= i都返回true。为什么?那不就是说i == j?在那种情况下,while循环不应该执行一次。但它无限循环。这是为什么?如何比较两个整数对象?

回答

4

虽然==可以在两个引用(并且是,当双方都是Integer)之间执行,但<=不能 - 因此编译器会取消装箱。所以,你的代码就相当于:

while (i.intValue() <= j.intValue() && 
     j.intValue() <= i.intValue() && 
     i != j) 

现在,当ij指不同Integer对象具有相同值,所有的这些条件将得到满足 - 因此循环不断执行。

+0

因此,即使在数学上,==和<=,都似乎是在比较相似比较事物的数量。在Java中并不是这样!任何想法为什么如此?为什么==比较引用和<=关注实际数量(intValue)?从一般的角度来看,这看起来很奇怪。说实话,我认为<=必须以某种方式比较hashCodes! – shanti

+1

@shanti:好吧,如果你用'int'而不是'Integer',一切都会好起来的。无论何时你有引用类型的操作数,'=='都会比较*引用*而不是内容 - 它就像那样简单。尽管Java可以在适当的时候改变为'=='开箱,但这将是一个突破性改变 - 自从Java 1.0以来,“==”比较一直是有效的,这意味着参考比较就像在任何其他两个参考之间一样。 –

+0

是有道理的。所以基本上,在包装类的情况下,==或!=检查引用,但是<= or > =检查包含在对象中的实际原始值。非常感谢您迅速,清楚地回复。 :) – shanti

0

==对象,如大写-I Integer,比较引用。 <=>=将取消对Integer对象的数值比较,这是完全不同的。

在这种情况下,认为==!=Integer的值完全无关。

0

“< =”正在比较值,而“!=”参考因此在这里所有的情况都是真实的,因此它将进入无限循环。

1

尝试:

while(!i.equals(j)) 

您正在使用==而不是两个原始INT值比较两个整数对象。也就是说,“整数”是一个对象,而int是一个原始值。对整数(0)和整数(0),对象执行= =将返回true,因为它们确实不相等 - >每个对象在内存中都有单独的位置。

“新”运算符在堆上分配动态内存。 对于==工作,你可以改变类型为int,如:

int i = 0; 
int j = 0; 

这将直接值比较。

如果使用“整数”,另一种选择是使用.compareTo方法,该方法会比较对象的值