Почему целые числа Java не указывают на одно и то же место в памяти, если они находятся за пределами байтовых границ?

Эта интересная проблема возникла сегодня в 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, и я надеюсь, что кто-то сможет пролить свет на эту тему.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
39
1

Ответы 1

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

Однако я не уверен, что это часть спецификации языка или платформы. Это просто оптимизация производительности, деталь реализации. Никогда не полагайтесь на это в своем коде. Используйте equals() в классах в штучной упаковке, никогда не используйте ==, даже если он «кажется работающим».

Muchos Спасибо Yous !!!

Prime72 15.05.2018 00:19

Другие вопросы по теме