Когда вы компилируете числовой литерал в 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.
Обратите внимание, что целочисленный кеш существует не по соображениям производительности, а скорее для соответствия JLS, раздел 5.1.7 ; Идентификатор объекта должен быть задан для значений от -128 до 127 включительно.
Integer # valueOf (int) также документирует это поведение:
этот метод, вероятно, даст значительно лучшую производительность в пространстве и времени за счет кэширования часто запрашиваемых значений. Этот метод всегда кэширует значения в диапазоне от -128 до 127 включительно и может кэшировать другие значения вне этого диапазона.