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

Int vs Целое сравнение Java

class datatype1
{

    public static void main(String args[])
    {
    int i1 = 1;
    Integer i2 = 1;
    Integer i3 = new Integer(1);

    System.out.println("i1 == i2"+(i1==i2));
    System.out.println("i1 == i3"+(i1==i3));
    System.out.println("i2 == i3"+(i2==i3));
}

}

Выход

i1 == i2true
i1 == i3true
i2 == i3false

Может кто-нибудь объяснить, почему я ошибаюсь при сравнении i2 и i3?

4b9b3361

Ответ 2

Integer i2 = 1;

Это результат автобоксинга. Вы конвертируете int (примитивный тип) в соответствующую оболочку.

 Integer i3 = new Integer(1);

Здесь нет необходимости в autoboxing, поскольку вы непосредственно создаете объект Integer.

Теперь в

i1 == i2
i1 == i3

i2 и i3 автоматически распаковываются, и выполняется обычное сравнение int, поэтому вы становитесь истинными.

Теперь рассмотрим

i2 == i3

Здесь оба i2 и i3 являются объектами Integer, которые вы сравниваете. Поскольку оба являются разными объектами (поскольку вы использовали новый оператор), он явно даст false. Примечание == оператор проверяет, указывают ли две ссылки на один и тот же объект или нет. Метод infact.equals(), если не переопределенный, делает то же самое.

Это то же самое, что сказать

    Integer i2 = new Integer(1);
    Integer i3 = new Integer(1);
    System.out.println("i2 == i3 "+(i2==i3));

который снова даст вам ложь.