JDK7 分析
JDK7中當咱們用頭插法 對舊table
數據重定位到新table
的時候咱們知道是會行程環的,環產生的核心函數transfer
以下,其中重點關注部分以標出。html
-
頭插法正常狀況下: -
併發狀況下,好比我有兩個線程在同時進行put數據跟擴容操做,線程1只執行了 Entry<K,V> next = e.next
就被掛起了,而線程2 正常執行完畢,結果圖以下: 線程2執行完畢後線程1接着從原來的暫停處開始執行下面的語句: 經過逐步分析跟繪圖能夠知道紅色部分會有環產生。JDK中HashMap是不安全的,多線程狀況下要用ConcurrentHashMap。
7vs8
7中找 Hash
用了4次,8中只用了1次。7 = 數組 + 鏈表,8 = 數組 + 鏈表 + 紅黑樹 7中是頭插法,多線程容易形成環,8中是尾插法。 7的擴容是所有數據從新定位,8中是位置不變+ 移動舊size大小來實現更好些。 7是先判斷是否要擴容再插入,8中是先插入再看是否要擴容。 HashMap
無論78都是線程不安全的,多線程狀況下記得用ConcurrentHashmap
。ConcurrentHashmap
下篇文章說。
常見問題
隨機蒐羅了一些常見HashMap
問題,若是把HashMap都看懂了應付這些應該沒問題。web
HashMap原理,內部數據結構。 HashMap中的put,get,remove大體過程。 HashMap中 hash函數實現。 HashMap如何擴容。 HashMap幾個重要參數爲何這樣設定。 HashMap爲何線程不安全,如何替換。 HashMap在JDK7跟JDK8中的區別。 HashMap中鏈表跟紅黑樹切換思路。
你遇到過HashMap的什麼問題呢
本文分享自微信公衆號 - sowhat1412(sowhat9094)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。數組