Почему одинаковое целочисленное значение имеет другой адрес памяти в 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];

См. также