Кеширование целых чисел в Java
Возможный дубликат:
Weird Java Boxing
Недавно я увидел презентацию, где был следующий образец кода Java:
Integer a = 1000, b = 1000;
System.out.println(a == b); // false
Integer c = 100, d = 100;
System.out.println(c == d); // true
Теперь я немного смущен. Я понимаю, почему в первом случае результат "false" - это потому, что Integer является ссылочным типом, а ссылки "a" и "b" различны.
Но почему во втором случае результат "true"?
Я слышал мнение, что JVM кэширует объекты для значений int от -128 до 127 для некоторых целей оптимизации. Таким образом, ссылки "c" и "d" одинаковы.
Может ли кто-нибудь дать мне больше информации об этом поведении? Я хочу понять цели этой оптимизации. В каких случаях производительность увеличивается и т.д. Ссылка на некоторые исследования этой проблемы будет велика.
Ответы
Ответ 1
Я хочу понять цели этого оптимизация. В каких случаях производительность увеличивается и т.д. Ссылка на некоторые исследования этого проблема будет большой.
Целью является, в основном, сохранение памяти, что также приводит к более быстрому коду из-за лучшей эффективности кеширования.
В принципе, класс Integer
хранит кеш экземпляров Integer
в диапазоне от -128 до 127, а все автобоксинг, литералы и использование Integer.valueOf()
возвращают экземпляры из этого кеша для диапазона, который он охватывает.
Это основано на предположении, что эти небольшие значения встречаются гораздо чаще, чем другие int, и поэтому имеет смысл избежать накладных расходов на наличие разных объектов для каждого экземпляра (объект Integer
занимает примерно 12 байтов).
Ответ 2
Посмотрите на реализацию Integer.valueOf(int)
. Он вернет тот же объект Integer
для входов меньше 256
.
EDIT:
На самом деле -128
до +127
по умолчанию, как указано ниже.