Как работает кеширование при операции autoboxing?
Начиная с Java 1.5, для целочисленных значений в диапазоне от -128 до + 127 объекты-обёртки кешируются внутри для повторного использования.
В классе-обёртке Integer есть внутренний класс IntegerCache. Он объявлен как private static. В этом внутреннем классе кешированные объекты находятся в массиве cache[]. Кеширование выполняется при первом использовании класса-обёртки. После первого использования, вместо создания нового экземпляра (кроме использования конструктора), используются кешированные объекты.
Код метода valueOf() класса Integer выгдядит так:
Кэширование касается не только класса-оболочки Integer. Имеются аналогичные реализации кеширования для других классов-оболочек целочисленных типов:
ByteCache, ShortCache, LongCache, CharacterCache.
Кешированные объекты не используются при создании объекта-обёртки с помощью конструктора.
На хабре есть статья, в которой SSiarhei (предполагаю, что крутой программист, потому что сдавал экзамен Oracle Certified Professional Java Programmer), в 2011 году написал: https://habr.com/ru/post/111189/
Так что происходит на самом деле?
Есть ли Integer пул, и если да, то какую роль он играет?
Soros
39 уровень
Кеширование или Integer пул?
Комментарии (18)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #2436575 Android Developer в AllPets
10 августа 2022, 10:02
Кэшируемые значения
————————————————
boolean -> true...false
byte,short, int, long -> -128...127
char-> 0...127
float, double -> none
————————————————
Также верхний предел Integer может быть быть изменены флагом VM.
Кэш не используется при создании через new Integer(10), а сам такой конструктор на основе значения объявлен устаревшим начиная с Java 16.
+6
wan-derer.ru
14 июня 2022, 06:15
1. Пул есть.
2. Единственный практический вывод, который я для себя сделал - нельзя сравнивать Integer через ==, надо использовать .equals()
0
Роман
6 июля 2022, 15:40
2. А какая разница? В обоих случаях вернёт true
-2
wan-derer.ru
7 июля 2022, 09:02
Уверен?
+2
Дмитрий Кузнецов
22 сентября 2023, 06:17
Если сравнивать через метод equals() то сравниваются значения как примитивы и кэш тут уже роли не играет. Вот что пишет документация Compares this object to the specified object. The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object.
0
Татьяна
20 марта, 21:01
Какая разница, если ты даже выходишь за диапазон пула, все равно через операторы сравнения выводит true, если значения одинаковы.
0
Артем Хрусталев
13 июня 2022, 21:12
У char кеш от 0 до 127 ?
0
Soros
12 апреля 2020, 09:25
Ок. Кеш класса - это и есть пул, если я правильно понял.
0
Justinian Judge в Mega City One Master
12 апреля 2020, 09:56
Можно считать Integer Cache и Integer pool синонимами.
0
Стас Пасинков Software Developer в Zipy Master
12 апреля 2020, 12:54
я бы даже сказал так:
кеширование интов (которое реализовано в классе IntegerCache) использует для своей работы пулл интов, который реализован в виде массива объектов Integer
0
Justinian Judge в Mega City One Master
11 апреля 2020, 19:29
Тебя какой-то филолог укусил, опять синонимичный ряд. Компьютер или электронно-вычислительная машина.
Есть пул (кеш) часто вызываемых объектов, которые нету смысла создавать и плодить новые инстансы.
- Этот пул создается для Стрингов (куда попадают строковые литералы программы или в рантайме при помощи метода intern()
- этот пул создается для Boolean типов, нет смысла в новых объектах для 1 млн вызова строки:
Boolean isSomething = true;
- этот пул создается для целочисленных литералов - Character, Byte, Short, Integern, Long
По умолчанию это от -128 до + 127, но:
- верхнюю границу можно изменять при помощи параметра запуска программы
- границы как и многое в джаве, зависят от конкретной реализации JVM
Как-то так. По поводу статических фабрик и valueOf Стас описал вроде.
Так что я голосую за вариант ответа "
кеширование это процесс оптимизации программы, суть которой заключается в создании готовых объектов для повторного использования, в наиболее часто используемом диапазоне. В Джаве, кеширование целочисленных оберток реализовано при помощи соответствующих пулов для конкретных типов, например пул Интеджеров, который также вполне можно назвать кэшем"
Как-то так
+8
Стас Пасинков Software Developer в Zipy Master
11 апреля 2020, 15:12
почему бы не открыть класс Integer и не посмотреть самому?
и вообще мне непонятно в чем у вас вопрос. вы приводите аргументы о том, что есть пул интов, еще и из разных источников.
а потом спрашиваете есть ли он?
да, есть. но вопрос, право, странный...
+1
Soros
11 апреля 2020, 15:56
Перед тем, как создать на этом форуме вопрос, на форуме, где могу рассчитывать на получение адекватного ответа от компетентных программистов, а не на что-то типа "не понимаю в чём вопрос", так вот перед тем, как задать это вопрос, я открыл класс Integer. И в самом вопросе привёл код метода valueOf класса Integer. А также своё понимание того, как это работает.
Источники разные, но в этих разных источниках кардинально по-разному описывается один и тот-же процесс. Из-за этой кардинальной разницы и возник вполне обоснованный вопрос.
Используется ли здесь Integer pool и каким образом? О пуле строк мне известно. Про Integer pool - нет. 0
Стас Пасинков Software Developer в Zipy Master
11 апреля 2020, 17:20
все-равно не до конца понял что же вам непонятно.
ладно.
я погуглил за вас, и нашел туториал по автобоксингу и анбоксингу на сайте оракла. в частности, там сказано такое:
если в двух словах, то там сказано, что компилятор преобразует такой код в
если вы все-равно не верите ни мне, ни ораклу - тогда пишете вашу программу с этой одной строкой, компилируете, а потом открываете командой javap для просмотра байткода
как видите, там идет вызов метода valueOf()
на вашем скрине есть код этого метода, и там вы видите, что сначала идет иф и проверяет что число входит в границы между IntegerCache.low и IntegerCache.high и потому достаем объект из массива IntegerCache.cache по индексу i + (-IntegerCache.low)
то-есть, 120 + (-(-128)) = 120 + 128 = 248, потому что объекты там лежат начиная от -128, но позиция в массиве то начинается с 0.
+5
Стас Пасинков Software Developer в Zipy Master
11 апреля 2020, 17:25
но если вы все-таки заходили внутрь класса Integer - мне непонятно как вы не увидели в нем внутренний класс IntegerCache.
а если видели - то мне абсолютно непонятно откуда в вас сомнения, что он существует...
0
Стас Пасинков Software Developer в Zipy Master
11 апреля 2020, 17:30
ааа, кажется я понял.
вы знаете что такое кеш интов, но не понимаете что такое пул интов?
0
Soros
12 апреля 2020, 09:24
Это в моём вопросе
Это в вашем комментарии.
0
Стас Пасинков Software Developer в Zipy Master
12 апреля 2020, 10:32
да, я просто не понимал что же вам не понятно тут.
вы сами пишете про то, что кеш/пул интов существует, описываете как он работает, все такое. а потом спрашиваете существует ли он и как работает))
и да, я понимал, что вы заходили внутрь класса. но не понимал как вы не видели кеш интов раз спрашивали о его существовании) думал может вы этот текст просто скопипастили откуда-то даже не разобравшись в нем, и просто потом в конце свой вопрос дописали)
пул - это просто набор чего-то. пул проксей, пул тредов, пул чисел.
кеш - это уже какое-то архитектурное решение предоставления ранее сохраненных данных (можно сказать, что когда мы сохранили данные изначально - то у нас теперь есть пул этих данных, в нашем случае пул интов)
+1