一、在每一個覆蓋了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返回的肯定值im
- 這樣會限制在之後版本改進hashCode 函數的能力