2021-03-02 關(guān)于HashCode

????????重新回顧了一下關(guān)于“==”和“equals(Object)”的區(qū)別,其中關(guān)于“equals”有一條不成文的規(guī)定:“重寫euqals方法,必須重寫hashcode方法”,之前對這條約定沒有一個(gè)清晰的認(rèn)知,今天查詢了一些這方面的資料,根據(jù)這些資料整理一下相關(guān)認(rèn)知,可能存在概念性的錯誤。

官方文檔定義以及一些常見的關(guān)于HashCode的使用協(xié)定:

hashCode()的作用是獲取哈希碼,也稱為散列碼;它實(shí)際上是返回一個(gè)int整數(shù)。這個(gè)哈希碼的作用是確定該對象在哈希表中的索引位置。

在 Java 應(yīng)用程序執(zhí)行期間,在對同一對象多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是將對象進(jìn)行 equals 比較時(shí)所用的信息沒有被修改。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無需保持一致。

如果根據(jù) equals(Object) 方法,兩個(gè)對象是相等的,那么對這兩個(gè)對象中的每個(gè)對象調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。

如果根據(jù) equals(java.lang.Object) 方法,兩個(gè)對象不相等,那么對這兩個(gè)對象中的任一對象上調(diào)用 hashCode 方法?不要求?一定生成不同的整數(shù)結(jié)果。但是,程序員應(yīng)該意識到,為不相等的對象生成不同整數(shù)結(jié)果可以提高哈希表的性能。(這里會產(chǎn)生hash沖突,為解決沖突會降低性能,其中hashmap使用拉鏈法解決沖突,解決沖突常見方法還有開發(fā)地址法,再哈希,建立公共溢出區(qū))


HashCode作用和意義:HashCode只是在用到哈希算法的數(shù)據(jù)結(jié)構(gòu)中得以體現(xiàn)它的作用,如常見容器,HashSet,HashMap,HashTable,通過hashcode方法計(jì)算索引位置來存儲數(shù)據(jù),加快查找速度,具體哈希表原理參考:哈希表

HashCode和Equals關(guān)系:HashCode方法與equals方法沒有直接關(guān)系,是通過相關(guān)數(shù)據(jù)結(jié)構(gòu)調(diào)用時(shí)會同時(shí)使用hashcode和equals,而產(chǎn)生的間接依賴關(guān)系(HashSet,HashMap,HashTable)

為什么重寫equals時(shí)必須重寫hashcode

舉例說明:

對于Set,要想保證元素不重復(fù),可兩個(gè)元素是否重復(fù)應(yīng)該依據(jù)什么來判斷呢? 這就是 Object.equals 方法了。但是,如果每增加一個(gè)元素就檢查一次,那么當(dāng)元素很多時(shí),后添加到集合中的元素比較的次數(shù)就非常多了。 也就是說,如果集合中現(xiàn)在已經(jīng)有1000個(gè)元素,那么第1001個(gè)元素加入集合時(shí),它就要調(diào)用1000次equals方法。這顯然會大大降低效率。于是,Java采用了哈希表的原理。 這樣,我們對每個(gè)要存入集合的元素使用哈希算法算出一個(gè)值,然后根據(jù)該值計(jì)算出元素應(yīng)該在數(shù)組的位置。所以,當(dāng)集合要添加新的元素時(shí),可分為兩個(gè)步驟:

先調(diào)用這個(gè)元素的 hashCode 方法,然后根據(jù)所得到的值計(jì)算出元素應(yīng)該在數(shù)組的位置。如果這個(gè)位置上沒有元素,那么直接將它存儲在這個(gè)位置上;

如果這個(gè)位置上已經(jīng)有元素了,那么調(diào)用它的equals方法與新元素進(jìn)行比較:相同的話就不存了,否則,將其存在這個(gè)位置對應(yīng)的鏈表中(Java 中 HashSet, HashMap 和 Hashtable的實(shí)現(xiàn)總將元素放到鏈表的表頭)。

HashMap舉例

籠統(tǒng)來說在Hash容器中,需要使用對象的hashcode計(jì)算對象的索引位置,如果索引位置上存在對象,再使用equals方法比較對象是否想等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容