java併發編程學習:HashMap和concurrentHashMap

HashMap的put方法

1.7將新元素插在鏈表的頭部

 public V put(K key, V value)
	// 若 哈希表未初始化(即 table爲空) 。 則使用構造函數時設置的閾值(即初始容量) 初始化數組table  
        if (table == EMPTY_TABLE) { 
        inflateTable(threshold); 
    }  
        //判斷key是否爲空值null,若key == null,則將該鍵-值存放到數組table 中的第1個位置,即table [0]
        if (key == null)
            return putForNullKey(value);
// 若 key ≠ null,則計算存放數組 table 中的位置(下標、索引)
        // a. 根據鍵值key計算hash值
        int hash = hash(key);
        // b. 根據hash值 最終獲得 key對應存放的數組Table中位置
        int i = indexFor(hash, table.length);
        // 判斷該key對應的值是否已存在(通過遍歷 以該數組元素爲頭結點的鏈表 逐個判斷),如果該對應數據已存在,執行覆蓋操作。用新value替換舊value,並返回舊value
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;	//保證併發訪問時,若HashMap內部結構發生變化,快速響應失敗
//若 該key不存在,則將“key-value”添加到table中
        addEntry(hash, key, value, i);
        return null;
    }

爲什麼HashMap中的數組大小必須是2的冪次

1-24.56
在這裏插入圖片描述
位操作比取餘操作速度塊

HashMap的get方法

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