Компилируется следующий код (с Java 8):
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
Но что он делает?
Распаковать i1
:
boolean compared = (i1.intvalue() == i2);
или поле i2
:
boolean compared = (i1 == new Integer(i2));
Итак, сравнивает ли он два объекта Integer
(по ссылке) или две переменные int
по значению?
Обратите внимание, что для некоторых чисел сравнение ссылок даст правильный результат, потому что класс Integer поддерживает внутренний кэш значений от -128
до 127
(см. также комментарий TheLostMind). Вот почему я использовал 1000
в своем примере и почему я специально спрашиваю о распаковке/упаковке, а не о результате сравнения.
Integer
поддерживает внутренний кеш значений между-128 to 127
. Таким образом, даже если вы сравнитеInteger i1=100
сInteger i2=100
, используя==
, вы получитеtrue
. Вы получитеfalse
, когда иi1
, иi2
не находятся в этом диапазоне локального кэша. - person TheLostMind   schedule 26.05.2015