HashMap1.7 的問題還有1.7 和1.8 的差別。
HashMap 是一個併發不安全的容器,在迭代操作是採用的是fast-fail 機制;在併發添加操作中會出現丟失更新的問題;因爲採用頭插法在併發擴容時會產生環形鏈表的問題,導致CPU 到達100%,甚至宕機。
解決併發問題可以採用
- Java 類庫提供的Collections 工具包下的Collections.synchronizedMap()方法,返回一個線程安全的Map
- 或者使用併發包下的 ConcurrentHashMap,ConcurrentHashMap採用分段鎖機制實現線程安全
- 使用HashTable (不推薦)
Hash1.7 和1.8 最大的不同在於1.8 採用了“數組+鏈表+紅黑樹”的數據結構,在鏈表長度超過8 時,把鏈表轉化成紅黑樹來解決HashMap 因鏈表變長而查詢變慢的問題;其次
- 在hash 取下標時將1.7 的9次擾動(5次按位與和4次位運算)改爲2次(一次按位與和一次位運算)
- 1.7 的底層節點爲Entry,1.8 爲node ,但是本質一樣,都是Map.Entry 的實現
- 還有就是在存取數據時添加了關於樹結構的遍歷更新與添加操作,並採用了尾插法來避免環形鏈表的產生
- 但是併發丟失更新的問題依然存在。