У меня есть вопрос по поводу следующего фрагмента кода:
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 онлайн, ничего не помогло.
Заранее спасибо
Спасибо
Для проверки равенства значений следует использовать equals
. Потому что Integer - это класс-обертка, который оборачивает значение int. ==
проверяет равенство на основе ссылки, поэтому в обоих случаях ваша ссылка будет разной.
Сравнивает данный объект с указанным объектом. Результат будет истинным тогда и только тогда, когда аргумент не является null и представляет собой объект Integer, который содержит то же значение int, что и данный объект.
n1.equals(n2);
Если вы выполните
int n1 = new Integer(47);
int n2 = new Integer(47);
Вы получите ожидаемый результат.
Поскольку Java поддерживает пул целых чисел от 127
до -128
, вы также можете сделать следующее
Integer n1 = Integer.valueOf(47);
Integer n2 = Integer.valueOf(47);<-- will return you the same reference
n1==n2 >>> True
С помощью ==
можно надежно сравнивать только примитивные типы. Для объектов (а Integer
является объектным типом) следует использовать метод equals()
.
==
можно использовать для объектов, но только для проверки того, являются ли два объекта одинаковыми. Например:
Integer n1 = new Integer(47);
Integer n2 = n1;
// n1 == n2 will be true
Лучше всего воспринимать int
как само число, а Integer
как записку с написанным на ней числом. ==
вернет истину, только если вы говорите об одной и той же записке, а equals()
вернет истину для любых двух записок с одинаковыми числами.
Проблема усложняется тем, что начиная с версии 1.5 в Java появилась функция autoboxing, то есть int
автоматически преобразуется в Integer
и наоборот, когда это необходимо. Это может привести к очень неожиданным результатам, если вы не будете осторожны.
n1 == n2
, сравнивает экземпляры объектов и поэтому n1 == n2
вернет false
, а n1 != n2
вернет true
, так как n1
и n2
не одинаковые экземпляры объектов..
Если вы используете метод equals
или получите значение int (primitive tpye)
, а затем сравните с помощью == или !=
, вы получите правильные результаты, например.
System.out.println(n1.equals(n2)); //true
System.out.println(!n1.equals(n2));//false
или
System.out.println(n1.intValue() == n2.intValue()); //true
System.out.println(n1.intValue() != n2.intValue()); //false