Авто Бокс против статических чисел - PullRequest
4 голосов
/ 01 августа 2011

Ценно ли использовать Integer i = NumberUtils.INTEGER_ONE вместо Integer i = 1?Я не знаю, что происходит за автобоксом.

Спасибо

Ответы [ 2 ]

9 голосов
/ 01 августа 2011

В основном это будет скомпилировано в:

Integer i = Integer.valueOf(NumberUtils.INTEGER_ONE);

при условии, что INTEGER_ONE объявлено как int.

Во время выполнения, предполагая, что INTEGER_ONE имеет значение 1, это будет фактически возвращать ссылку на один и тот же объект каждый раз, гарантированный Спецификацией языка Java, потому что он находится в диапазоне от -128 до 127. Значения вне этого диапазона могут возвращать ссылки на один и тот же объект, но не обязаны.

0 голосов
/ 01 августа 2011

Многие оболочки и служебные классы в Java имеют кэшированные пулы. Integer использует внутренне кэшированный статический массив ссылок 'Integer', чтобы определить, когда вызывается метод valueOf (). Строки также имеют похожий пул.

Если, однако, вы сделаете что-то вроде Integer i = 128, это начнет влиять на производительность, поскольку автобокс включит не кэшированные целые числа (не то, чтобы он не включался для кэшированных целых чисел). В отличие от случая, когда кешированные целые были возвращены, этот оператор создает новый объект. Создание объекта стоит дорого и снижает производительность.

[EDIT]

Уточненный ответ

...