Почему одинаковое целочисленное значение имеет другой адрес памяти в Java?
Сегодня я впервые попробовал Java-язык. Когда я пробую этот код, я чувствую себя очень странно:
int a =500;
System.out.println(System.identityHashCode(500));
System.out.println(System.identityHashCode(500));
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(a));
Все эти результаты разные. Но когда я изменил 500 на 50, он стал тем же результатом.
Почему?
Ответы
Ответ 1
Но когда я изменил 500 на 50, он стал тем же результатом.
Autoboxing кэширует преобразование примитивов в Object. Небольшие значения получают один и тот же объект, а больших значений нет.
Примечание: в то время как значения между -128 и 127 всегда кэшируются, более высокие значения могут быть кэшированы в зависимости от настроек командной строки. Подробнее см. Источник Integer
.
Это также называется Веселый шаблон
Вы можете установить максимальный размер кеша Integer с помощью
-Djava.lang.Integer.IntegerCache.high=NNNN
-XX:AutoBoxCacheMax=NNNN
-XX:+AggressiveOpts // sets it higher depending on the version e.g. 10000
http://martykopka.blogspot.co.uk/2010/07/all-about-java-integer-cache.html
http://www.javaspecialists.eu/archive/Issue191.html
Мне очень странно
Я знаю, что вы хотите прочесть этот вопрос.;)
Ответ 2
Он кэширует значение int
-128 и 127 (включительно), поэтому он будет ссылаться на тот же экземпляр в памяти в этом диапазоне
Когда вы передаете примитивное значение (здесь 10
)
System.identityHashCode(10);
Он автоматически расшифровывает его до объекта Integer
, и inturns использует valueOf()
метод класса Integer для преобразования
Пример
Integer a = 10;
будет преобразован во внутреннее использование valueOf()
1: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
Integer.valueOf()
, у которого есть реализация кэша
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
поэтому, если вы передадите значение от -128 до 127 (включительно), он будет использовать кешированную версию, как вы можете видеть из
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
См. также