Когда вы компилируете числовой литерал в Java и присваиваете ему целое число (заглавная I
), компилятор выдает:
Integer b2 =Integer.valueOf(127)
Эта строка кода также генерируется, когда вы используете автобокс.
valueOf
реализован так, что определенные числа «объединены», и он возвращает тот же экземпляр для значений, меньших 128.
Из исходного кода Java 1.6, строка 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Значение high
может быть настроено на другое значение с помощью системного свойства.
-Djava.lang.Integer.IntegerCache.high = 999
Если вы запустите вашу программу с этим системным свойством, она выдаст true!
Очевидный вывод: никогда не полагайтесь на две одинаковые ссылки, всегда сравнивайте их с .equals()
методом.
Так b2.equals(b3)
будет печатать true для всех логически равных значений b2, b3.
Обратите внимание, что Integer
кэш не существует по соображениям производительности, а скорее для соответствия JLS, раздел 5.1.7 ; Идентификатор объекта должен быть задан для значений от -128 до 127 включительно.
Integer # valueOf (int) также документирует это поведение:
этот метод, вероятно, даст значительно лучшую производительность пространства и времени за счет кэширования часто запрашиваемых значений. Этот метод всегда кэширует значения в диапазоне от -128 до 127 включительно и может кэшировать другие значения за пределами этого диапазона.