2010-01-22 31 views
3

我來自C++背景,今天剛剛開始Java。假設我和一些數據成員有一堂課。例如:如何在java中實現智能成員比較?

現在讓我們說我這樣做:

Person john = new Person("john", "doe"); 
Person johndoe = new Person("john", "doe"); 
if (john == johndoe) { 
    System.out.println("They are Equal"); 
} else { 
    System.out.println("They are NOT Equal"); 
} 

這裏的結果是 「不相等」。我明白這是因爲Java正在比較引用(內存地址),並且由於它們是內存中的不同位置,所以測試失敗。我讀過Java不支持運算符重載,所以我不能重載運算符==,那麼有沒有一種方法可以實現我的成員比較? object.equals方法看起來很有前途,但我讀過這是不好的做法,不要重寫這個。

更新: 好吧,我確信重寫等於OK!我找不到那篇文章說它不好。感謝您的幫助,我學習Java時可能會遇到更多問題!

回答

6

你這樣做:

if (john.equals(johndoe)) { 
    ... 
} 

和實現對象的equals()方法:

public class Person { 
    private String firstName; 
    private String lastName; 
    private String fullName; 

    public Person(String firstName, String lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.fullName = firstName + lastName; 
    } 

    public String getFirstName() { return firstName; } 
    public String getLastName() { return lastName; } 
    public String getFullName() { return fullName; } 

    @Override 
    public boolean equals(Object ob) { 
    if (ob == null) return false; 
    if (ob.getClass() != getClass()) return false; 
    Person other = (Person)ob; 
    if (!firstName.equals(other.firstName)) return false; 
    if (!lastName.equals(other.lastName)) return false; 
    if (!(fullName.equals(other.fullName)) return false; 
    return true; 
    } 

    @Override 
    public int hashCode() { 
    return firstName.hashCode()^lastName.hashCode()^fullName.hashCode(); 
    } 
} 

有兩點需要注意:

  1. 以上是更多的Java風格比C++ -樣式。我強烈建議您在編寫Java時採用Java編碼約定。如果你是Java新手,你應該嘗試並學習它們;和
  2. Java有一個equals/hashCode合約,這意味着如果兩個對象相等,那麼它們的散列碼必須必須相等。
+0

我在某處讀到了你不想重寫等號,但我不明白爲什麼不這樣......我會再次嘗試再次找到該文章併發布它。等於看起來對我來說也是正確的方式。 – cchampion 2010-01-22 04:47:33

+1

你100%絕對應該覆蓋等於。 – danben 2010-01-22 04:48:40

+0

上面的代碼是完美的,只是我不認爲你需要比較全名,因爲全名字段是通過追加名字和姓氏獲得 – 2010-01-22 04:56:08