Помещенные в коробку примитивы и эквивалентность

Таким образом, меня задали этот вопрос сегодня.

Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);

Что распечатает эта программа? Это возвращает true. Я ответил, что это будет всегда распечатывать ложь из-за того, как я понял автоматический (и автоматическая ООН) упаковка. У меня создалось впечатление, что присвоение Целого числа = 3 создаст новое Целое число (3) так, чтобы == оценил ссылку скорее затем примитивное значение.

Кто-либо может объяснить это?

15
задан John Vint 13 January 2011 в 17:16
поделиться

4 ответа

Значения в коробке между -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

20
ответ дан 1 December 2019 в 00:59
поделиться

Вот что происходит на самом деле:

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.

.
11
ответ дан 1 December 2019 в 00:59
поделиться

Кэширование происходит и вне автобокса, учтите, что:

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

Так что я думаю, что обычно вы хотите держаться подальше от '==' при сравнении Объектов

.
4
ответ дан 1 December 2019 в 00:59
поделиться

Это потому, что некоторые (автопоставленные) целые числа кэшируются, так что вы фактически сравниваете одну и ту же ссылку -- в этом посту есть более подробные примеры и объяснение.

5
ответ дан 1 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: