Все ли классы обертки в Java имеют value pool?
Все ли классы обертки в Java имеют value pool?
Ответы (1 шт):
Можно полагать, что под value pool имеется в виду кэш значений, и тогда краткий ответ на данный вопрос будет отрицательным: не все, но многие классы-обёртки имеют кэш значений.
Закэшированные значения имеют в основном обёртки для целочисленных типов, а также Boolean (приведены ссылки на реализацию кэшей для OpenJDK 8):
Boolean:TRUEиFALSEByte,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, НЕ имеющий закэшированных значений по очевидной причине "кэшировать нечего".