Недавно я видел презентацию, где был следующий пример кода Java:
Integera=1000, b = 1000; System.out.println(a == b); // false Integerc=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 по умолчанию, как указано ниже.