Как сравнить два целых объекта?


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 <= j, и j <= i возвращает true. Почему? И разве это не означает, что i == j? В этом случае цикл while не должен выполняться ни разу. Но он идет по бесконечной петле. Почему это так?

4 2

4 ответа:

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

while (i.intValue() <= j.intValue() &&
       j.intValue() <= i.intValue() &&
       i != j)
Теперь, когда i и j ссылаются на разные объекты Integer с одинаковым значением, все эти условия будут выполнены - следовательно, цикл продолжает выполняться.

Попробуйте:

while(!i.equals(j))

Вы сравниваете два целочисленных объекта с==, а не с двумя примитивными значениями int. То есть" Integer " - это объект, в то время как int-это примитивное значение. Делаю != on объект вернет true для Integer (0) и Integer(0), потому что они действительно не равны -> каждый имеет отдельное место в памяти.

Оператор "new" выделяет динамическую память в куче. Для == работы, вы можете изменить тип на int, как в:

int i = 0;
int j = 0;

Это позволит сравнить ценности напрямую.

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

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

Думайте о == и != в этом случае как о совершенно не связанных со значениями Integers.

"