Вопрос-ответ

Integers caching in Java [duplicate]

Кэширование целых чисел в Java

Возможное дублирование:

Странный Java-бокс


Недавно я видел презентацию, где был следующий пример кода 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() будут возвращать экземпляры из этого кеша для диапазона, который он охватывает.

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

Ответ 2

Посмотрите на реализацию Integer.valueOf(int). Он вернет тот же Integer объект для входных данных меньше, чем 256.

Редактировать:

На самом деле это -128 to +127 по умолчанию, как указано ниже.

java jvm