Java中的HashMap深入詳解

主要介紹HashMap的一些特性,以及面試中會遇到的一些問題。

1、java的HashMap

      HashMap是java集合框架中的一員。採用的是數組與鏈表的結構,兩種數據結構都用到了。數組隨機訪問,鏈表方便添加元素。

2、HashMap的結構

      HashMap裏面有個成員變量叫做 table,類型是Entry[]。Entry是HashMap的內部類。Entry有個成員變量就做next,如果put的
時候經過計算得到需要放置的位置已經存在數據了,則通過equalse比較是否一樣。如果不一樣就把next指向另外一個值,這樣就
解決了碰撞的問題。理想情況下,table數據一個位置上只放一個鍵值對。

3、HashMap的put過程

      1、計算key的hashCode,比如得到了1000,然後與table這個數組的長度做與運算得到6,於是就把這個數據存放到table[6]這個位置。
      2、取出的時候與存放一樣,得到hashCode在與運算,然後就知道存放到哪裏了。所以理想情況下HashMap的時間複雜度是一次命中。
      3、從中可以看出,數據存到那個位置與hashCode有關係。那麼如果存放同一個位置,舊數據是怎麼處理的呢。

4、HashMap如何存放hashCode值相同的數據

      1、比如我put兩個數據,可以是 “key1","key2" 恰好他們經過運算都是放到了table[3]這個位置,那麼會比較key1.equalse(key2),
如果一樣,說明是同一個對象,則覆蓋。並且put方法會返回這個舊值。
      2、如果調用equalse之後發現他們不同,則Entry的next將會引用另外一個數據,於是兩個對象就像鏈一樣連接起來。get的時候
經過hashCode計算放哪裏,通過equalse判斷取出哪個值。

5、需要注意的問題

      1、HashMap的put時,需要hashCode與equalse。所以你經常會看到,要實現hashCode與equalse方法這條編程建議。
      2、如果有個HashMap往裏面不停放值,同時key這個對象是我們定義的。而涉及到hashCode的字段運算被我們改了,那麼這個
值就可能再也取不出來了。
      3、HashMap是線程不安全的,原因就是沒有同步,同時分配內存時。table數據默認是16個大小的,數據存的多自然不夠用,
擴容時很容易導致Entry的next相互引用。於是出現死循環,這樣就GG了。
      4、如果有疑問,以及我說的不對的。可以留言在下面,我們一起進步。
發佈了54 篇原創文章 · 獲贊 67 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章