Ответ 1
Причина, по которой вторая печать оценивается как истина, заключается в том, что первые 128 объектов Integer кэшируются классом Integer. Вы хотите использовать. equals
Возможный дубликат:
Weird Java Boxing
Привет,
Может кто-нибудь объяснить, почему последняя печать возвращает false?
int a = 100;
int b = 100;
System.out.println(a == b); // prints true
Integer aa = 100;
Integer bb = 100;
System.out.println(aa == bb); // prints true
Integer aaa = 1000;
Integer bbb = 1000;
System.out.println(aaa == bbb); // prints false
Спасибо Майкл
Причина, по которой вторая печать оценивается как истина, заключается в том, что первые 128 объектов Integer кэшируются классом Integer. Вы хотите использовать. equals
Вы сравниваете два объекта Integer, которые с помощью оператора == сравнивают две ссылки вместо двух значений.
Используйте метод equals()
, чтобы убедиться, что вы сравниваете оба значения.
Вы должны использовать Integer.compareTo
для проверки числового равенства для объектов Integer
. Оператор ==
сравнивает объекты, а не числа.
Объекты Integer
автобоксируются с помощью метода Integer.valueOf(int)
. Посмотрите документацию по этому методу. Тогда все должно стать ясным.
То, что вы хотите использовать, - aaa.equals(bbb)
. В Java с использованием объектов == на объектах сравнивается, являются ли они одним и тем же экземпляром объекта, а не равны ли они по методу equals()
.
Я удивлен, что второй случай возвращает true
. Но почему в Java Puzzlers они советуют не смешивать использование классов Wrapper и оператора ==
.
Взгляните на этот класс и код:
public class RichardInt {
private int value;
public RichardInt(int value) {
this.value = value;
}
}
Что было бы результатом следующего?
RichardInt aa = new RichardInt(100);
RichardInt bb = new RichardInt(100);
System.out.println(aa == bb); // prints false
Он печатает false, потому что оператор equals ==
сравнивает ссылки при использовании с объектами. Помните, что в Java объекты являются ссылочными типами, а примитивы (например, int
) - это типы значений. (примечание: может ли кто-нибудь сообщить мне, если я злоупотребляю "типом ценности"? У меня такое чувство, что я есть.) Следующее напечатало бы правду:
RichardInt aa = new RichardInt(100);
RichardInt bb = aa;
System.out.println(aa == bb); // prints true
... так как aa
и bb
ссылаются на один и тот же экземпляр RichardInt
.
Итак, возможно, описанное выше поведение легче понять в следующем примере...
Intger aaa = new Intger(1000);
Intger bbb = new Integer(1000);
System.out.println(aaa == bbb); // prints false
В более поздних версиях Java классы-оболочки (Integer
и Float
и Boolean
и т.д.) могут быть автоматическими, что означает, что вы можете сделать следующее:
Integer aa = 1000;
// this is a shorthand for...
// Integer aa = new Integer(1000);
Но это приводит к запутанному поведению, когда вы пробуете такие вещи:
Integer aaa = 1000;
Integer bbb = 1000;
System.out.println(aaa == bbb); // prints false
Или даже лучше, вы можете получить головоломки, подобные этому...
// what values of x and y will result in output?
if(!(x<y)&&!(x>y)&&!(x==y)) {
System.out.println("How is this possible?");
}
В конце концов, всякий раз, когда вы имеете дело с объектами, вы должны использовать .equals()
вместо ==
.
Integer aaa = 1000;
Integer bbb = 1000;
System.out.println(aaa.equals(bbb)); // prints true