оператор равенства, странные результаты?

У меня есть вопрос по поводу следующего фрагмента кода:

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);>> True
Комментарии (2)
Решение

С помощью == можно надежно сравнивать только примитивные типы. Для объектов (а Integer является объектным типом) следует использовать метод equals().

== можно использовать для объектов, но только для проверки того, являются ли два объекта одинаковыми. Например:

Integer n1 = new Integer(47);
Integer n2 = n1;
// n1 == n2 will be true

Лучше всего воспринимать int как само число, а Integer как записку с написанным на ней числом. == вернет истину, только если вы говорите об одной и той же записке, а equals() вернет истину для любых двух записок с одинаковыми числами.

Проблема усложняется тем, что начиная с версии 1.5 в Java появилась функция autoboxing, то есть int автоматически преобразуется в Integer и наоборот, когда это необходимо. Это может привести к очень неожиданным результатам, если вы не будете осторожны.

Комментарии (2)

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
Комментарии (6)