Все ли классы обертки в Java имеют value pool?
Все ли классы обертки в Java имеют value pool?
Ответы (1 шт):
Можно полагать, что под value pool имеется в виду кэш значений, и тогда краткий ответ на данный вопрос будет отрицательным: не все, но многие классы-обёртки имеют кэш значений.
Закэшированные значения имеют в основном обёртки для целочисленных типов, а также Boolean
(приведены ссылки на реализацию кэшей для OpenJDK 8):
Boolean
:TRUE
иFALSE
Byte
,Short
,Long
: от -128 до 127 включительноCharacter
: символы от'\u0000'
to'\u007F'
включительноInteger
: по умолчанию от -128 до 127 включительно, однако верхнюю границу можно увеличить при помощи системного свойстваjava.lang.Integer.IntegerCache.high
.
Классы-обёртки для чисел с плавающей точкой Float
и Double
НЕ имеют закэшированных значений, однако документация всё же рекомендует использовать метод valueOf
для получения "обёрточных" значений, так как он вероятно предоставляет значительно лучшую производительность, кэшируя наиболее часто используемые значения:
Впрочем, фактически реализации данных методов в OpenJDK сводятся к вызову конструкторов new Float(float v)
/ new Double(double v)
(что не исключает других реализаций с использованием кэша).
И наконец, существует класс-обёртка Void
, НЕ имеющий закэшированных значений по очевидной причине "кэшировать нечего".