Изненадан съм, че вторият случай връща 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
) са стойностни типове. (забележка: може ли някой да ме уведоми, ако използвам неправилно „тип стойност“? Имам чувството, че съм.) Следното ще се отпечата вярно:
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