Ответ 1
i1 == i2
приводит к un-boxing и выполняется обычное сравнение. (см. первая точка в JLS 5.6.2)
i2 == i3
приводит к сопоставлению ссылок. Помните, что i2
и i3
- это два разных объекта. (см. JLS 15.21.3)
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?
i1 == i2
приводит к un-boxing и выполняется обычное сравнение. (см. первая точка в JLS 5.6.2)
i2 == i3
приводит к сопоставлению ссылок. Помните, что i2
и i3
- это два разных объекта. (см. JLS 15.21.3)
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));
который снова даст вам ложь.