Все ли классы обертки в Java имеют value pool?

Все ли классы обертки в Java имеют value pool?


Ответы (1 шт):

Автор решения: Nowhere Man

Можно полагать, что под 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, НЕ имеющий закэшированных значений по очевидной причине "кэшировать нечего".

→ Ссылка