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

Почему это выполняется во время цикла? Я понимаю, что i != j. Но отдельно, как i <= j, так и j <= i возвращает true. Зачем? И разве это не значит, что i == j? В этом случае цикл while не должен выполняться ни разу. Но для бесконечного цикла. Почему это так?Как сравнить два целых объекта?

ответ

4

В то время как == может выполняться между двумя ссылками (и если обе стороны равны Integer), <= не может - поэтому компилятор распаковывается. Таким образом, ваш код эквивалентен:

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

Теперь, когда i и j относятся к различным Integer объектам с тем же значением, все эти условия будут выполнены - следовательно, цикл продолжает выполняться.

+0

Так что даже если математически, == и <=, как кажется, похожи в сравнении количество сравниваемых вещей. В Java это не так! Любая идея, почему так? Почему == сравнивает ссылки и <= фокусируется на фактическом количестве (intValue)? С общей точки зрения это выглядит довольно странно. Честно говоря, я думал, что <= должно каким-то образом сравнивать хэш-коды! – shanti

+1

@shanti: Если вы используете 'int' вместо' Integer', все будет хорошо. Всякий раз, когда у вас есть операнды ссылочных типов, '==' будет сравнивать * ссылки *, а не содержимое - это так просто. Хотя Java можно было бы изменить, чтобы сделать '==' unbox там, где это уместно, это было бы нарушающим изменением - сравнение '==' было действительным с Java 1.0, что означает сравнение ссылок, как и между любыми двумя другими ссылками. –

+0

имеет смысл. В принципе, в случае классов-оболочек == or! = Проверяет ссылки, но <= or > = проверяет фактические примитивные значения, содержащиеся в объекте. Большое спасибо за быстрое и четкое реагирование. :) – shanti

0

== для объектов, таких как капитал-I Integer, сравнивает ссылки. <= и >= удалят объекты Integer и сравнивают значения численно, что совершенно по-другому.

Подумайте, что == и != в этом случае полностью не связаны со значениями Integer.

0

«< =» сравнивает значения, а «! =» Ссылки здесь здесь, все случаи верны, поэтому он идет в бесконечном цикле.

1

Try:

while(!i.equals(j)) 

Вы сравниваете два целочисленных объектов с ==, а не двух примитивных значений Int. То есть «Integer» является объектом, тогда как int является примитивным значением. Doing! = На объекте вернет true для Integer (0) и Integer (0), потому что они действительно не равны -> каждый из них имеет отдельное расположение в памяти.

«Новый» оператор выделяет динамическую память в куче. Для == к работе, вы можете изменить тип в целом, как:

int i = 0; 
int j = 0; 

Это будет сравнивать значения непосредственно.

Если вы используете «Integer», другой альтернативой является использование метода .compareTo, который будет сравнить значения объектов

Смежные вопросы