class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
Вывод:
false
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
Вывод:
true
Примечание. Числа от -128 до 127 соответствуют действительности.
Ответы:
Когда вы компилируете числовой литерал в Java и присваиваете ему целое число (заглавная
I
), компилятор выдает:Эта строка кода также генерируется, когда вы используете автобокс.
valueOf
реализован так, что определенные числа «объединены», и он возвращает тот же экземпляр для значений, меньших 128.Из исходного кода Java 1.6, строка 621:
Значение
high
может быть настроено на другое значение с помощью системного свойства.Если вы запустите вашу программу с этим системным свойством, она выдаст true!
Очевидный вывод: никогда не полагайтесь на две одинаковые ссылки, всегда сравнивайте их с
.equals()
методом.Так
b2.equals(b3)
будет печатать true для всех логически равных значений b2, b3.Обратите внимание, что
Integer
кэш не существует по соображениям производительности, а скорее для соответствия JLS, раздел 5.1.7 ; Идентификатор объекта должен быть задан для значений от -128 до 127 включительно.Integer # valueOf (int) также документирует это поведение:
источник
false
. На самом деле, это может произойти уже сегодня, как побочный эффект применения Escape-анализа и скалярной замены.Автобокс кэширует от -128 до 127. Это указано в JLS ( 5.1.7 ).
Простое правило, которое нужно помнить при работе с объектами: используйте,
.equals
если хотите проверить, равны ли два объекта, используйте,==
если хотите увидеть, указывают ли они на один и тот же экземпляр.источник
Использование примитивных типов данных, int, даст в обоих случаях ожидаемый результат.
Однако, поскольку вы используете объекты Integer, оператор == имеет другое значение.
В контексте объектов == проверяет, ссылаются ли переменные на одну и ту же ссылку на объект.
Для сравнения значения объектов следует использовать метод equals (), например
который укажет, меньше ли b2, чем b1, больше или равно (проверьте API)
источник
Это связано с оптимизацией памяти в Java.
источник
Взгляните на Integer.java, если значение находится в диапазоне от -128 до 127, он будет использовать кэшированный пул, поэтому
(Integer) 1 == (Integer) 1
пока(Integer) 222 != (Integer) 222
источник
В других ответах описывается, почему наблюдаемые эффекты можно наблюдать, но это не относится к делу программистов (конечно, это интересно, но то, о чем вы должны забыть при написании реального кода).
Чтобы сравнить целочисленные объекты на равенство, используйте
equals
метод.Не пытайтесь сравнивать объекты Integer на равенство, используя оператор тождественности
==
.Может случиться, что некоторые равные значения являются идентичными объектами, но это не то, на что обычно следует полагаться.
источник
Я написал следующее, так как эта проблема относится не только к Integer. Мой вывод заключается в том, что чаще всего, если вы используете API неправильно, вы увидите неправильное поведение. Используйте его правильно, и вы должны увидеть правильное поведение:
источник