面試準備一之HashMap

看了很多面經都講了HashMap 今天自己也來講一講

在JDK1.8之前 HashMap還是很本分的堅持着數組+鏈表的結構,然並卵 好景不長,JDK1.8後如果鏈表中的數據超過8個,則會插入到紅黑樹種來存取(個人感覺,因爲讀取速度肯定是紅黑樹大於鏈表的。當數據量過大或存在大量的衝突時鏈表的查找速度較慢所以應用紅黑樹的結構來解決問題)。接下來,就帶着大家講講HashMap 的前世和今生吧。

 

首先,我們來講一講JDK1.8之前的HashMap,數組+鏈表結構,爲什麼要採用這種形式呢?因爲傳統的鏈表添加刪除操作快,但讀取速度慢,而數組讀取速度快,但添加和刪除的速度慢(具體可見數據結構哈),而採用數組加鏈表的方式就極大程度的改進了讀取和增刪的速度,HashMap具體結構如下圖所示。

很容易我們可以看到HashMap是由一組Entry數組和鏈表來組成的,而對應的<K,V>是如何插入的呢?那就要說說我們大名鼎鼎的hash()函數了,放一下源碼吧,待我找找哈。。。。

public class HashMap<K,V> extends AbstractMap<K,V>(實現克隆和序列化以及繼承AbstractMap我就先略過哈)
    implements Map<K,V>, Cloneable, Serializable {

可以看到HashMap中的hash key value next,hash個人認爲是存儲位置(沒記錯HashMap的大小是65536也就是int的大小了哈),key value不必多說,這個next應該就對應了鏈表了,當然存的時候沒有hash衝突就放到鏈表首位了哈。咱們接着放源碼

看這風騷的hashCode函數,就知道hash()函數存在其中,不過竟然是用key和value來計算得到的存儲在entry數組中的位置嗎?return中間那個是^記得沒錯是異或吧...,查了一下 果真沒錯,來我們繼續點開這個Object的函數

上面的就不翻譯了,看到了吧 Object裏hashCode這個如果是null的話返回時啥> 0! 終於知道爲什麼HashMap會允許null建了吧,哈哈!而且key值爲null的value可是存在了entry數組的打頭哦!這還不夠,爲了詳細瞭解hashCode函數我又鬼使神差的點了進去,然後,和自己的無符號右移16爲的數做異或,估計這回返回的數組位置就可以不重複啦,當然Object裏面也有對應的註釋,如下:

上面就說明了,對一個固定了object,只有一個integer的數值對應,那麼對於hash函數有幾種呢,本寶寶找到了一下三種

操.....太卡了  具體的先留着 以後分析行麼各位親?咱接着往下走

然後就是咱們的存值操作,其實也就是putVal了,來上源碼~

狗在這先,未完待續啊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章