Целочисленные варианты конструкции - PullRequest
2 голосов
/ 03 мая 2011

Привет всем, я столкнулся с интересным случаем и ищу объяснение.

В Java 1.6:

Integer a = new Integer(5);
Integer b = new Integer(5);

System.out.println(a == b);

Integer c = 5;
Integer d = 5;

System.out.println(c == d);

Я получаю:

false
true

В Eclipse я проверил в отладчике. a и b - это разные объекты, а c и d - это одни и те же объекты (но отличаются от a и b).

Может кто-нибудь подсказать мне, что происходит под капотом? Это волшебство JVM? Понимаете, что целое число (5) уже находится в стеке?

Ответы [ 2 ]

6 голосов
/ 03 мая 2011

Java кэширует Integer экземпляров для значений, которые он считает достаточно близкими к нулю, если они являются константами. Создание Integer вручную с использованием new обходит этот кеш. Вы можете вызвать Integer.valueOf с int, чтобы получить соответствующий Integer без обхода кэша.

Для получения дополнительной информации вы можете выполнить поиск "Кеш целочисленных данных JVM" в выбранной вами поисковой системе.

1 голос
/ 03 мая 2011

@ ответ icktoofay прибивает его, но комментарии мутят воду.

  • Для JLS версии 3.0 требуется , что целые числа находятся в диапазоне от -128 до +127автоматически помещаются в кешированные значения;см. JLS, раздел 5.1.7 .Другими словами, вы можете положиться на это поведение для целых чисел в этом диапазоне для всех жалоб Java 5 и более поздних платформ.

    (Аналогичные требования применяются к логическим значениям, байтам, символам и шортам.)

  • JLS, в частности, позволяет одинаковому поведению автобоксирования распространяться наболее широкий диапазон значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...