Причина, по которой вторая печать принимает истинное значение, заключается в том, что первые 128 объектов Integer кэшируются классом Integer. Вы хотите использовать. равно
Вы сравниваете два объекта Integer, которые с помощью оператора == сравнивают две ссылки вместо двух значений.
Используйте метод equals ()
, чтобы убедиться, что вы сравниваете оба значения.
Вы должны использовать Integer.compareTo
для проверки числового равенства для Integer
объектов. Оператор ==
сравнивает объекты, а не числа.
Объекты Integer
автоматически упаковываются с использованием метода Integer.valueOf (int)
. Взгляните на документацию по этому методу. Тогда все должно проясниться.
Я удивлен, что второй случай возвращает 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, потому что оператор равенства ==
сравнивает ссылки при использовании с объектами. Помните, что в Java объекты являются ссылочными типами, а примитивы (например, int
) являются типами значений. (примечание: может ли кто-нибудь сообщить мне, если я неправильно использую «тип значения»? У меня такое чувство, что это так.) Следующее будет печатать true:
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
Вы хотите использовать aaa.equals(bbb)
. В Java использование == для объектов сравнивает, являются ли они одним и тем же экземпляром объекта, а не равны ли они в соответствии с их методом equals()
.