Дополнительно
оператор равенства, странные результаты?
У меня есть вопрос по поводу следующего фрагмента кода:
public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
}
Полученный результат меня удивил:
false
true
Я проверил конструктор в Javadoc онлайн, ничего не помогло.
Заранее спасибо
Спасибо
1
3
Для проверки равенства значений следует использовать
equals
. Потому что Integer - это класс-обертка, который оборачивает значение int.==
проверяет равенство на основе ссылки, поэтому в обоих случаях ваша ссылка будет разной.Если вы выполните
Вы получите ожидаемый результат.
Поскольку Java поддерживает пул целых чисел от
127
до-128
, вы также можете сделать следующееС помощью
==
можно надежно сравнивать только примитивные типы. Для объектов (аInteger
является объектным типом) следует использовать методequals()
.==
можно использовать для объектов, но только для проверки того, являются ли два объекта одинаковыми. Например:Лучше всего воспринимать
int
как само число, аInteger
как записку с написанным на ней числом.==
вернет истину, только если вы говорите об одной и той же записке, аequals()
вернет истину для любых двух записок с одинаковыми числами.Проблема усложняется тем, что начиная с версии 1.5 в Java появилась функция autoboxing, то есть
int
автоматически преобразуется вInteger
и наоборот, когда это необходимо. Это может привести к очень неожиданным результатам, если вы не будете осторожны.n1 == n2
, сравнивает экземпляры объектов и поэтомуn1 == n2
вернетfalse
, аn1 != n2
вернетtrue
, так какn1
иn2
не одинаковые экземпляры объектов..Если вы используете метод
equals
или получите значениеint (primitive tpye)
, а затем сравните с помощью== или !=
, вы получите правильные результаты, например.или