2012-10-16 57 views
5

有兩種equals方法嗎?有兩種equals()方法

public boolean equals(Bigram b) { 
    return b.first == first && b.second == second; 
    } 

@Override public boolean equals(Object o) { 
    if (!(o instanceof Bigram)) 
     return false; 
    Bigram b = (Bigram) o; 
    return b.first == first && b.second == second; 
} 

比較2種方法,當我們要覆蓋等方法,爲什麼我們需要定義equals方法,其參數爲Object類型的!

回答

6

其實是有這個一個很好的理由:

  • 您需要equals(Object)方法來覆蓋超等於在java.lang.Object
  • 你方法往往想要一個重載equals(Bigram)方法來處理的情況下編譯器可以在編譯時證明類型是Bigram。這通過避免類型檢查/轉換來提高性能,併爲您在代碼中進行更好的類型檢查。
  • 最後,您可能想要以特殊的方式實現equals,以便使用與它們本身不是Bigram實例的對象相等進行測試。這應該謹慎使用(你是否真的希望某個不是Bigram實例的東西被認爲與Bigram相同?),但它確實有一些有效的應用程序(例如比較不同類型的集合對象的內容)。

通常但它是最好地實現它們,這樣一個方法調用其他的,如:

public boolean equals(Bigram b) { 
    return b.first == first && b.second == second; 
} 

@Override public boolean equals(Object o) { 
    if (!(o instanceof Bigram)) return false; 
    return equals((Bigram)o); 
} 

這種方式是更簡潔,意味着你只需要一次實現平等的測試邏輯(不要重複自己!)。

2

的框架/調用equals()方法(如在containsKey()地圖,在詞典等)調用從對象類的覆蓋equals()和不重載的版本的API。因此,您需要需要來定義public boolean equals(Object obj)