1. 程式人生 > >為什麼在重寫equals()方法時,一般都會重寫HashCode()方法?

為什麼在重寫equals()方法時,一般都會重寫HashCode()方法?

重寫equals()方法主要是為了方便比較兩個物件內容是否相等。hashCode()方法用於返回呼叫該方法的物件的雜湊碼值,此方法將返回整數形式的雜湊碼值。
一個類如果重寫了 equals()方法,通常也有必要重寫 hashCode()方法,目的是為了維護hashCode()方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。hashCode 的常規協定主要有以下幾點。
□ 在 Java 應用程式執行期間,在同一物件上多次呼叫 hashCode()方法時,必須一致地返回相同的整數,前提是物件上 equals()方法比較中所用的資訊沒有被修改。從某一應用程式的一次執行到同一應用程式的另一次執行,該整數無需保持一致。
□ 如果根據 equals(Object) 方法,兩個物件是相等的,那麼在兩個物件中的每個物件上呼叫 hashCode()方法都必須生成相同的整數結果。
□ 以下情況不是必須的:如果根據 equals(java.lang.Object) 方法,兩個物件不相等,那麼在兩個物件中的任一物件上呼叫 hashCode()方法必定會生成不同的整數結果。但是,程式設計師應該知道,為不相等的物件生成不同整數結果可以提高散列表的效能。
實際上,由 Object 類定義的 hashCode()方法確實會針對不同的物件返回不同的整數。(通常是通過將該物件的內部地址轉換成一個整數來實現的,但是Java程式語言不需要這種實現技巧。)
注意:相等的物件必須有相同的雜湊碼,反之雜湊碼相同則不一定物件相等,而且不相等的物件並不一定需要有不同的雜湊碼。
基於雜湊法的集合需要使用 hashCode()方法返回的雜湊碼值儲存和管理元素,例如Hashtable、HashMap和HashSet等,在使用這些集合時,首先會根據元素物件的雜湊碼值確定其儲存位置,然後再根據equals()方法結果判斷元素物件是否已存在,最後根據判斷結果執行不同處理。因此,實際應用時如果重寫了equals()方法,那麼hashCode()方法也會被重寫。