《Java程式設計思想》讀書筆記——淺析==與equals()
阿新 • • 發佈:2018-12-11
我們知道,==
操作符在Java中被用來判斷兩個值是否相等,但是,當我們用它來判斷兩個物件是否相等時,得到的結果卻出乎了我們的意料。
public class Test {
public static void main(String[] args) {
String str1 = new String("hello world");
String str2 = new String("hello world");
System.out.println("str1 == str2 : " + (str1 == str2));
}
}
執行結果:
str1 == str2 : false
《程式設計思想》裡是這麼解釋大意的:
對於物件來說,
==
操作符實際上比較的是物件的引用而非內容,故儘管這兩個字串內容相同,但比較結果還是false
那麼,我們該如何判斷兩個物件是否相等呢?此時,就該equals()
方法登場了。
public class Test {
public static void main(String[] args) {
String str1 = new String("hello world");
String str2 = new String("hello world" );
System.out.println("str1.equals(str2) : " + str1.equals(str2));
}
}
執行結果:
str1.equals(str2) : true
結果正如我們預期的那樣,但事情並不是總那麼簡單。看看下面例子:
public class Dog {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Dog dog1 = new Dog("Herry", 3);
Dog dog2 = new Dog("Herry",3);
System.out.println(dog1 == dog2);
System.out.println(dog1.equals(dog2));
}
}
執行結果:
false
false
我們定義了一個Dog類,在測試類中新建了兩個相同的Dog物件,並分別用==
和equals()
方法對這兩個物件的引用進行了比較。第一個結果為false
在我們的意料之中,但為什麼用equals()
方法對他們比較結果還是false
呢?我們來看看JDK
原始碼。
public boolean equals(Object obj) {
return (this == obj);
}
原來,從Object
繼承過來的equals()
方法的預設行為是比較引用。所以除非在自己的新類中覆蓋equals()
方法,否則不可能表現出我們希望的行為。
假設對於Dog
物件來說,name
相同且age
相同就可判定兩個Dog
物件相等,那麼我們的重寫方法可定義如下:
@Override
public boolean equals(Object obj) {
return this.name==((Dog)obj).name && this.age==((Dog)obj).age;
}
重新測試,結果無誤!