如下是關於HashCode的官方文檔定義:html
hashcode方法返回該對象的哈希碼值。支持該方法是爲哈希表提供一些優勢,例如,java.util.Hashtable 提供的哈希表。
hashCode 的常規協定是:
在 Java 應用程序執行期間,在同一對象上屢次調用 hashCode 方法時,必須一致地返回相同的整數,前提是對象上 equals 比較中所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另外一次執行,該整數無需保持一致。
若是根據 equals(Object) 方法,兩個對象是相等的,那麼在兩個對象中的每一個對象上調用 hashCode 方法都必須生成相同的整數結果。
如下狀況不 是必需的:若是根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼在兩個對象中的任一對象上調用 hashCode 方法一定會生成不一樣的整數結果。可是,程序員應該知道,爲不相等的對象生成不一樣整數結果能夠提升哈希表的性能。
實際上,由 Object 類定義的 hashCode 方法確實會針對不一樣的對象返回不一樣的整數。(這通常是經過將該對象的內部地址轉換成一個整數來實現的,可是 JavaTM 編程語言不須要這種實現技巧。)
當equals方法被重寫時,一般有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具備相等的哈希碼。
以上這段官方文檔的定義,咱們能夠抽出成如下幾個關鍵點:java
一、hashCode是用來在散列存儲結構中肯定對象的存儲地址的,減小對equals(java.lang.Object) 方法的調用,提升查找效率;程序員
二、若是兩個對象相同,就是equals(java.lang.Object) 方法的返回值爲true,那麼這兩個對象的hashCode必定要相同;編程
三、兩個對象的hashCode相同,並不必定表示兩個對象就相同,也就是不必定equals(java.lang.Object) 方法的返回值爲true。編程語言
四、若是對象的equals方法被重寫,那麼對象的hashCode也儘可能重寫,而且產生hashCode使用的對象,必定要和equals方法中使用的一致,不然就會違反上面提到的第2點;post
補充:性能
hashCode值有時還會被用於計算底層存儲位置的索引,如HashSet、HashMap的存儲機制。詳情見:Java基礎知識總結之類的集合。url
參考出處:Java中hashCode的做用 spa