Варианты построения целых чисел

#java #integer

#java #целое

Вопрос:

Всем привет, я столкнулся с интересным явлением и ищу объяснение.

В 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) уже находится в стеке?

Ответ №1:

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

Возможно, вам захочется выполнить поиск «JVM Integer cache» в выбранной вами поисковой системе для получения дополнительной информации.

Комментарии:

1. Я полагаю, что все значения от -128 до 127 кэшируются, и я почти уверен, что это было для JVM Sun.

2. Смотрите также Integer.valueOf(int i)

3. кроме того, jvm разрешено кэшировать целые числа, полученные через Integer.valueOf , поэтому вы можете получить один и тот же объект обратно при двух вызовах Integer.valueOf, даже если число выходит за пределы диапазона -128-127.

4. Интересное чтение по теме, thecodersbreakfast.net/index.php?post/2011/04/13/Java-Quiz-44

5. Ага. Это необычно. Я понял, new что принудительно создал объект, но был смущен тем, как Java / JVM разрешила другие экземпляры. Спасибо всем.

Ответ №2:

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

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

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

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

Комментарии:

1. А, понятно. Я знал об автоматической упаковке, но не понимал, что это связано с кэшированными значениями. Очень аккуратная вещица.