如下是關於HashCode的官方文檔定義:java
hashcode方法返回該對象的哈希碼值。支持該方法是爲哈希表提供一些優勢,例如,java.util.Hashtable 提供的哈希表。 hashCode 的常規協定是: 在 Java 應用程序執行期間,在同一對象上屢次調用hashCode方法時,必須一致地返回相同的整數,前提是對象上 equals 比較中所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另外一次執行,該整數無需保持一致。 若是根據 equals(Object) 方法,兩個對象是相等的, 那麼在兩個對象中的每一個對象上調用 hashCode 方法都必須生成相同的整數結果。 如下狀況不是必需的:若是根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼在兩個對象中的任一對象上調 用 hashCode 方法一定會生成不一樣的整數結果。 可是,程序員應該知道,爲不相等的對象生成不一樣整數結果能夠提升哈希表的性能。 實際上,由 Object 類定義的 hashCode 方法確實會針對不一樣的對象返回不一樣的整數。 (這通常是經過將該對象的內部地址轉換成一個整數來實現的,可是 JavaTM 編程語言不須要這種實現技巧。) 當equals方法被重寫時,一般有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定, 該協定聲明相等對象必須具備相等的哈希碼。
以上這段官方文檔的定義,咱們能夠抽出成如下幾個關鍵點:程序員
一、hashCode的存在主要是用於查找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列存儲結構中肯定對象的存儲地址的;算法
二、若是兩個對象相同,就是適用於equals(java.lang.Object) 方法,那麼這兩個對象的hashCode必定要相同;編程
三、若是對象的equals方法被重寫,那麼對象的hashCode也儘可能重寫,而且產生hashCode使用的對象,必定要和equals方法中使用的一致,不然就會違反上面提到的第2點;數據結構
四、兩個對象的hashCode相同,並不必定表示兩個對象就相同,也就是不必定適用於equals(java.lang.Object) 方法,只可以說明這兩個對象在散列存儲結構中,如Hashtable,他們「存放在同一個籃子裏」。編程語言
1.hashcode是用來查找的,若是你學過數據結構就應該知道,在查找和排序這一章有 例如內存中有這樣的位置 0 1 2 3 4 5 6 7 而我有個類,這個類有個字段叫ID,我要把這個類存放在以上8個位置之一,若是不用hashcode而任意存放,那麼當查找時就 須要到這八個位置裏挨個去找,或者用二分法一類的算法。 但若是用hashcode那就會使效率提升不少。 咱們這個類中有個字段叫ID,那麼咱們就定義咱們的hashcode爲ID%8,而後把咱們的類存放在取得得餘數那個位置。 好比咱們的ID爲9,9除8的餘數爲1,那麼咱們就把該類存在1這個位置,若是ID是13,求得的餘數是5, 那麼咱們就把該類放在5這個位置。這樣,之後在查找該類時就能夠經過ID除8求餘數直接找到存放的位置了。 2.可是若是兩個類有相同的hashcode怎麼辦那(咱們假設上面的類的ID不是惟一的),例如9除以8和17除以8的餘數都是1, 那麼這是否是合法的,回答是:能夠這樣。那麼如何判斷呢?在這個時候就須要定義 equals了。 也就是說,咱們先經過 hashcode來判斷兩個類是否存放某個桶裏,但這個桶裏可能有不少類, 那麼咱們就須要再經過 equals 來在這個桶裏找到咱們要的類。 那麼。重寫了equals(),爲何還要重寫hashCode()呢? 想一想,你要在一個桶裏找東西,你必須先要找到這個桶啊,你不經過重寫hashcode()來找到桶,光重寫equals()有什麼用啊
兩個對象值相同(x.equals(y)==true),但卻可有不一樣的hash code,這句話對不對?爲何?性能