覆蓋equals 時總要覆蓋hashCode(9)

一、在每一個覆蓋了equals 方法的類中,也必須覆蓋hashCode緩存

  • 這是關於hashCode 的通用約定
  • 這樣能夠與 基於散列的集合一塊兒工做,好比:HashMap、HashSet、HashTable

二、Object 規範:函數

  • 在應用程序執行期間,equals 比較的信息不變,對同一對象屢次調用,hashCode 返回同一整數
  • 在同一應用程序的屢次執行中,hashCode 返回整數能夠不一致
  • 兩個對象equals 比較相等,hashCode 必須相等
  • 兩個對象equals 不等,hashCode不必定不等
  • 不等的hashCode會提升散列集合的性能

三、相等的對象必須有相等的hashCode 性能

  • 散列集合中,先比較hashCode ,相等才作equals 比較
  • 編寫一個合法,但很差用的hashCode 是沒有任何意義 ,以下:
  • 散列表退化爲鏈表

四、好的散列函數,傾向於(不保證):爲每個不等的對象產生不等的hashCode對象

  • 對每個關鍵域(equals 方法比較的域),都作散列計算,而且合併爲一個
  • 對於冗餘域(equals 比較沒用到的域),必須排除在外
  • 若是一個類包含多個類似的域,用乘法計算散列值效果會更好
  • 以下,但會一個簡單的、肯定的結果

五、對於不可變類,計算hashCode 消耗大,能夠考慮緩存hashCodehash

六、若是某類型大多數對象都會用做散列鍵,能夠建立時就計算hashCode程序

  • 不然,能夠考慮延時計算hashCode

七、不要在計算hashCode 的時候 排除掉對象的關鍵部分 來提高性能方法

  • 這裏省事,可能會致使hashCode 不起做用

八、不要在程序中,依賴hashCode返回的肯定值im

  • 這樣會限制在之後版本改進hashCode 函數的能力
相關文章
相關標籤/搜索