Эта интересная проблема возникла сегодня в Java: если два Integer инициализируются одним и тем же значением, в Java они будут указывать на одно и то же место в памяти (я предполагаю, чтобы сэкономить память).
Integer x = 10;
Integer y = 10;
out.println(x.equals(y) + " " + (x==y));
Это выведет true true. Кроме того, мы можем установить для x и y другие числа, кроме 10;
Integer x = -128;
Integer y = -128;
out.println(x.equals(y) + " " + (x==y));
А также
Integer x = 127;
Integer y = 127;
out.println(x.equals(y) + " " + (x==y));
И они также будут выводить true true. Но если мы установим x и y на -129, они больше не будут указывать на одно и то же место в памяти.
Integer x = -129;
Integer y = -129;
out.println(x.equals(y) + " " + (x==y));
Это выводит true false, очень интересный аспект. Я не знаю, почему Integer будут указывать на разные места в памяти, если они находятся за пределами диапазона Byte, и я надеюсь, что кто-то сможет пролить свет на эту тему.




Насколько мне известно, современные реализации JVM имеют «одиночные экземпляры» для всех целых чисел от -128 до +128, аналогичные внутренним строкам; они просто всегда существуют в куче, хотите вы их или нет. Таким образом, упаковка int 5 в Integer вернет не новый объект Integer, а «singleton» экземпляр Integer со значением 5. Как вы заметили, упаковка 129 даст новый экземпляр фактически, поэтому == вернет false, если вы сделаете это дважды. Он работает только для значений в штучной упаковке от -128 до +128, потому что это синглтоны под капотом по соображениям эффективности.
Однако я не уверен, что это часть спецификации языка или платформы. Это просто оптимизация производительности, деталь реализации. Никогда не полагайтесь на это в своем коде. Используйте equals() в классах в штучной упаковке, никогда не используйте ==, даже если он «кажется работающим».
Muchos Спасибо Yous !!!