天天看點

hashCode()方法對HashSet,HashMap的重要作用

        上一篇文章介紹了HashSet是如何判斷元素相同的,其中有一個很重要的方法是hashCode()。從《瘋狂Java講義》中看到了hashCode()方法的具體作用,記錄一下。

        hash(也被翻譯為哈希、散列)算法的功能是,它能保證快速查找被檢索的對象,hash算法的價值在于速度。當需要查詢集合中的某個元素時,hash算法可以直接根據元素的hashCode值計算出該元素的存儲位置,進而快速定位該元素。為了了解這個概念,可以先看數組(數組是所有能存儲一組元素裡最快的資料結構)。數組可以包含多個元素,每個元素都有索引 。如果需要通路某個數組元素,隻需提供該元素的索引,接下來即可根據索引值計算該元素在記憶體裡的存儲位置。

        表面上看起來,HashSet集合裡面的元素都是沒有索引的,實際上當程式向HashSet中添加元素時,HashSet會根據元素的hashCode值來計算它的存儲位置,這也可以快速定位該元素。

        為什麼不直接使用數組,還需要使用HashSet呢?因為數組元素的索引是連續的,而數組的長度是固定的,無法自由增加數組的長度。而HashSet就不一樣了,HashSet采用每個元素的hashCode值來計算其存儲位置,進而可以自由增加長度,并可以根據元素的hashCode值來通路元素。是以,當從HashSet中通路元素時,HashSet先計算元素的hashCode值(也就是調用該對象的hashCode()方法的傳回值),然後直接的該hashCode值對應的位置取出該元素——這就是HashSet速度很快的原因。