Integer i1 = 1;
Integer i2 = new Integer(1);
System.out.println(i1 == i2);
Когда вы присваиваете 1 i1
, это значение помещается в квадрат, создавая объект Integer
. Затем сравнение сравнивает две ссылки на объекты. Ссылки не равны, поэтому сравнение не удается.
Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 != i2);
Поскольку они инициализируются с помощью констант времени компиляции, компилятор может и выполняет их, и указывает на один и тот же объект Integer
.
(Обратите внимание, что я изменил значения с 1000 на 100. Как указывает @NullUserException, интернируются только маленькие целые числа.)
Вот действительно интересный тест. Посмотрим, сможешь ли ты понять это. Почему первая программа печатает true
, а вторая false
? Используя свои знания по боксу и анализу времени компилятора, вы сможете понять это:
// Prints "true".
int i1 = 1;
Integer i2 = new Integer(i1);
System.out.println(i1 == i2);
// Prints "false".
int i1 = 0;
Integer i2 = new Integer(i1);
i1 += 1;
System.out.println(i1 == i2);
Если вы понимаете вышесказанное, попытайтесь предсказать, что печатает эта программа:
int i1 = 0;
i1 += 1;
Integer i2 = new Integer(i1);
System.out.println(i1 == i2);
(После того, как вы угадаете, запустите его и посмотрите! )