#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. А, понятно. Я знал об автоматической упаковке, но не понимал, что это связано с кэшированными значениями. Очень аккуратная вещица.