Java源碼集合類HashMap學習1

        Java中集合類HashMap是存儲鍵值(key,value)對爲元素的集合,鍵和值都是以類類型來存儲,通過鍵(key)來獲得對應的值(value)。使用HashMap集合最大的一個優點是查詢值(value)的速度快。

       爲什麼集合HashMap查詢值的速度快呢?這裏就要涉及到HashMap的底層實現,用了數據結構哈希表(hash table)。對與哈希表的實現原理這裏做個簡單介紹,可以讓我們從全局上了解HashMap的底層實現原理,這樣更有利於我們知道爲什麼HashMap要這樣實現。哈希表的底層其實就是一個數組,如下圖所示:



        假設要往這個哈希表存儲這樣一組鍵值對(key,value)數據:
        ("China","中國")、

        ("USA","美國")、

        ("HK","香港")、

        ("Canada","加拿大")、

        ("France","法國")

        根據鍵值求出它的一個哈希碼也叫散列碼(是一個整數),通過調用一個求哈希碼的方法,假設該方法是        hashCode(),比如:
hashCode("China")=3214,
        hashCode("USA")=4012,
        hashCode("HK")=6123,
        hashCode("Canada")=3214,
        hashCode("France")=3214

        求出的這些個整數:3214、4012、6123、3214、3214就是哈希碼了,計算出的哈希碼值不一定都是不同的值,當存儲的數據量比較大的時候計算出相同的哈希碼值也是很常見的。這裏爲了說明方便故意設計有三個相同的哈希碼值3214。接下來,有這麼個方法根據哈希碼值求出這些哈希碼值存儲在數組中的下標,假設該方法爲index(),比如:
        index(3214) = 1,
        index(4012) = 3,
        index(6123) = 5,
        index(3214) = 1,
        index(3214) = 1,
        這樣就求出了這些鍵值對在數組中存儲的下標:1,3,5,1,1。把這組數據依次存儲到數組中具體的過程,如下圖所示:


        從圖中可以看出,圈號G代表的存儲元素("Canada","加拿大")它在數組中的下標和圈號A都是1,並且該位置已經被圈號A佔了,那麼是不是圈號G的元素就把圈號A覆蓋了呢?顯然不能這樣處理,而是圈號A就會有一個引用指向下一個元素,所以圈號G就被放在了圈號A下面(A->G),其實這個就是組成了一個鏈表。當然具體是A指向G,還是G指向A的下一個元素就要看具體的實現。圈號M存儲的數組下標也是1,那麼就放在了圈號G的下面,圈號G指向了圈號M,最終就成了如上圖所示的數據結構。

        上面說明如何存儲鍵值對數據到哈希表中,那麼我們如何根據鍵(key)值獲取值(value)呢?比如:當要根據字符串"Canada"獲取值"加拿大"的時候,先計算字符串"Canada"的哈希碼如:3214,然後在用這個哈希碼3214求出在數組中的下標如:1。用上圖來說明這個查找的過程。求出了存儲的數組下標1,那麼先與第一個鍵值對元素也就是圈號A的鍵(key)值比較,字符串"Canada"與字符串"China"是否相等,顯然是不相等的也就會繼續與圈號A的下一個元素圈號G比較,很明顯相等這樣就找到了要查找的鍵值對元素。

        以上就是簡單介紹了哈希表數據結構的基本實現,想要了解詳細的哈希表數據結構實現請看數據結構相關的書。







發佈了43 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章