繼承關係下的hashCode改寫

按照JDK API上的描述,Object類中的hashCode方法的最重要的功能就是爲了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。 JDK API上詳細描述瞭如何改寫hashCode方法:

  • 在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。
  • 如果根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。
  • 如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用 hashCode 方法不 要求一定生成不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同整數結果可以提高哈希表的性能。

其中的第三條原則可以作爲繼承關係下改寫hashCode的基本原則。 也就是說如果子類對象可以與父類對象進行內容上的比較,則不能改寫子類的hashCode方法,讓它直接繼承父類的實現即可。實施要點如下:

  • 在父類中同時改寫equals方法與hashCode方法;
  • 在子類中改寫equals方法,保證子類對象可以與父類對象進行比較;
  • 子類中不改寫hashCode方法,直接繼承父類中改寫的hashCode方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章