Я удивлен вторым случаем возврата 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
person
Richard JP Le Guen
schedule
17.08.2010