底層是基於數組+鏈表實現的,真正存放數據的是entry<k,v>的數組數組
當不一樣的對象發生碰撞時,HashMap經過單鏈表來解決,將新元素加入<鏈表>表頭(頭插法),經過next指向原有的元素。單鏈表在Java中的實現就是對象的引用(複合)。安全
對大鏈表進行了優化,超過閾值後將鏈表修改成紅黑樹後查詢效率大大增長(當鏈表較長時轉爲將鏈表紅黑樹),未優化以前是o(n),優化後是o(log n)數據結構
jdk沒有對它進行任何的同步操做,因此會出現併發訪問的問題,甚至會出現死循環致使系統不可用併發
concurrenHashMap(guava中的cache採用的就是這個)優化
原理:concurrenthashmap採用了分段鎖技術,其中segment繼承於reentrantlock。每當一個線程佔用鎖訪問一個segment時,不會影響到其餘的segment線程
1.7採用了分段鎖,1.8取消了分段鎖,改用CAS + synchronized來保證併發安全性code
1.8以後在數據結構上作了改動,超過閾值後採用紅黑樹保證了查詢效率,甚至取消了reentrantlock(可重入鎖),改爲synchronized對象