1. HashMap是數組加鏈表組成,當鏈表多長則轉成紅黑樹,樹狀結構。
2. Node對象記錄值,根據hash的值,自己記錄自己的落點位置。
final int hash; //記錄hash算法之後的整型數,hash算法就是(
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
) final K key; V value; Node<K,V> next;//單向鏈表
Node node = new Node();
Node[] tables;//成員
3. 深層次理解
key value 封裝成Node()節點
解決節點位置 location,計算數組的大小,數組默認大小是16,
落點算法:
a.希望得到一個整型數 int i = Object.hashCode()
b.根據這個控制範圍 0~15之間 i%16取餘
4.put的過程中先初始化數組,但是有個線程安全的問題
在HashMap中可以用hashTable去解決線程安全,hashTable中put是用到了synchroized;
ConcurrentHashMap中put方法中,運用Volatile 解決共享變量的可見性 ;
擴容標準16*0.75=12,超過12則擴容;
5.put 線程安全問題
(1)當我們想數組插入元素時,此時採用的是CAS無鎖化的方式
(2)往數組下面的節點走的時候。替換,鏈表,紅黑樹
(3)下面的數組線程安全問題用Synchroized同步鎖進行控制,同步代碼塊。