1. 程式人生 > >《Java程式設計思想》讀書筆記——淺析==與equals()

《Java程式設計思想》讀書筆記——淺析==與equals()

我們知道,==操作符在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;
}

重新測試,結果無誤!