Кеширование целых чисел в 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 по умолчанию, как указано ниже.