jdk1.8 HashMap和ConcurrentHashMap知識點

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同步鎖進行控制,同步代碼塊。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章