Таким образом, меня задали этот вопрос сегодня.
Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);
Что распечатает эта программа? Это возвращает true. Я ответил, что это будет всегда распечатывать ложь из-за того, как я понял автоматический (и автоматическая ООН) упаковка. У меня создалось впечатление, что присвоение Целого числа = 3 создаст новое Целое число (3) так, чтобы == оценил ссылку скорее затем примитивное значение.
Кто-либо может объяснить это?
Значения в коробке между -128 и 127 кэшируются. Боксирование использует метод Integer.valueOf
, который использует кэш. Значения вне диапазона не кэшируются и всегда создаются как новый экземпляр. Так как ваши значения попадают в кэшируемый диапазон, то значения равны с помощью оператора ==.
Кавычки из спецификации языка Java:
Если значение p, будучи кэшированным, истинно, фальшивый, байт, чар в диапазоне \u0000 на \u007f, или int or short число между -128 и 127, тогда пусть r1 и r2 будут результатами любых двух боксерские превращения p. Всегда случай, что r1 == r2.
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7
Вот что происходит на самом деле:
Integer c = Integer.valueOf(5);
Integer d = Integer.valueOf(a.intValue() + b.intValue());
Java поддерживает кэш объектов Integer
между -128 и 127. Сравните со следующим:
Integer a = 300;
Integer b = 200;
Integer c = 500;
Integer d = a + b;
System.out.println(c == d);
Который должен печатать false
.
Кэширование происходит и вне автобокса, учтите, что:
Integer a = 1;
Integer b = new Integer(1);
Integer c = Integer.valueOf(1);
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == a);
это напечатает:
false
false
true
Так что я думаю, что обычно вы хотите держаться подальше от '==' при сравнении Объектов
.Это потому, что некоторые (автопоставленные) целые числа кэшируются, так что вы фактически сравниваете одну и ту же ссылку -- в этом посту есть более подробные примеры и объяснение.