1. 程式人生 > >為什麼要重寫equals和HashCode方法

為什麼要重寫equals和HashCode方法

同事問我的題,說我答不上來沒法留在公司工作,答的不是很好,特此整理一下。

對於這個問題,我覺得首先應該去思考的是原來的equals方法和HashCode方法是什麼樣的。 原生的hashCode值是根據記憶體地址換算出來的一個值。 原生的equals方法是嚴格判斷兩個物件是否相等的方法(object1 == object2)。

然而在實際的應用過程中,我們需要的相等往往並不是絕對相等,而是對應的屬性相等就行,這種時候我們就需要修改equals方法了。

那這時為什麼要重寫hashcode方法呢,讓我們看一看hashCode的通用約定 (1)在一個應用程式執行期間,如果一個物件的equals方法做比較所用到的資訊沒有被修改的話,那麼,對該物件呼叫hashCode方法多次,它必須始終如一地返回 同一個整數。在同一個應用程式的多次執行過程中,這個整數可以不同,即這個應用程式這次執行返回的整數與下一次執行返回的整數可以不一致。 (2) 如果兩個物件根據equals(Object)方法是相等的,那麼呼叫這兩個物件中任一個物件hashCode方法必須產生同樣的整數結果。 (3)如果兩個物件根據equals(Object)方法是不相等的,那麼呼叫這兩個物件中任一個物件的hashCode方法,不要求必須產生不同的整數結果。然而,程式設計師應該意識到這樣的事實,對於不相等的物件產生截然不同的整數結果,有可能提高散列表(hash table)的效能。

那麼,現在假設我們用改寫過的equals方法判斷兩個物件相等(判斷標準假設選取某個屬性),如果不重寫hashCode方法,那麼會違反上述約定2。