Подтвердить что ты не робот

Сравнение объектов Integer

У меня есть следующий код:

public class Test {

    public static void main(String[] args) {

        Integer alpha = new Integer(1);
        Integer foo = new Integer(1);

        if(alpha == foo) {
            System.out.println("1. true");
        }

        if(alpha.equals(foo)) {
            System.out.println("2. true");
        }

    } 

}

Выход выглядит следующим образом:

2. true

Однако изменение типа Integer object на int приведет к другому результату, например:

public class Test {

    public static void main(String[] args) {

        Integer alpha = new Integer(1);
        int foo = 1;

        if(alpha == foo) {
            System.out.println("1. true");
        }

        if(alpha.equals(foo)) {
            System.out.println("2. true");
        }

    } 

}

Новый вывод:

1. true
2. true

Как это может быть так? Почему первый пример кода не выводит 1. true?

4b9b3361

Ответ 1

Для ссылочных типов == проверяет, равны ли ссылки, т.е. указывают ли они на один и тот же объект.

Для примитивных типов == проверяет, равны ли значения.

java.lang.Integer является ссылочным типом. int является примитивным типом.

Изменить: если один операнд имеет примитивный тип, а другой ссылочный тип, который распаковывается в подходящий примитивный тип, == будет сравнивать значения, а не ссылки.

Ответ 2

Объекты Integer являются объектами. Это звучит логично, но это ответ на вопрос. Объекты создаются на Java с использованием ключевого слова new, а затем сохраняются в памяти. При сравнении вы сравниваете местоположения памяти объектов, а не значение/свойства объектов.

Используя метод .equals(), вы фактически сравниваете значения/свойства объектов, а не их местоположение в памяти:

new Integer(1) == new Integer(1) возвращает false, а new Integer(1).equals(new Integer(1)) возвращает true.


int являются примитивным типом java. Когда вы создаете int, все, на что ссылается, - это значение. Когда вы сравниваете любой примитивный тип в Java, все, что сравнивается, - это значение, а не местоположение памяти. Вот почему 5 == 5 всегда возвращает true.

Когда вы сравниваете объект Integer с примитивным типом, объект, по возможности, преобразуется в примитивный тип. С Integer и int это возможно, поэтому они сравниваются. Вот почему Integer(1).equals(1) возвращает true.

Ответ 3

== для объектов проверяет, совпадают ли ссылки, почему он возвращает false для Integers. Однако для базовых типов (ints, floats,...) он проверяет на равенство, почему вы становитесь истинными.

Я должен упомянуть, что в первом случае, когда вы сравниваете Integer и int, int преобразуется в объект Integer (autoboxing), а затем происходит сравнение ссылок. Поскольку они разные, он возвращает false.

Ответ 4

Integer == int здесь применяется автоматический бокс (поэтому Integer преобразован в int перед сравнением), так что true.. но Integer == Целое здесь сравнение объектов, так как ссылка отличается настолько ложной.

Ответ 5

Что вы будете использовать new Integer(1) для создания нового объекта, он каждый раз создает совершенно другой объект, даже если он имеет такое же значение. "==" проверяет, являются ли объекты одинаковыми, а не значениями данных. В вашем случае вы могли бы проверить значение следующим образом:

if(alpha.intValue() == foo.intValue()) {
 // 
}

Ответ 6

Первый пример: Использование оператора == между объектами проверяет ссылочное равенство, и поскольку вы сравниваете два разных объекта, они не равны.

Второй пример: При использовании символа == между типом-оболочкой (Integer, Long и т.д.) И числовым типом (int, long и т.д.) Тип-оболочка распаковывается, и проверка равенства выполняется между двумя примитивными числовыми типами (Ie между int и int). Unboxing является частью двоичной цифровой рекламы, далее здесь: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2