hashmap原始碼分析

2021-10-24 20:22:00 字數 653 閱讀 3992

1.8中hashmap已經刪除了transfer函式,原來導致形成環鏈的問題得以解決,不過依舊執行緒不安全,比如兩個執行緒在同時put的時候,在第乙個執行緒判斷完hash衝突後,掛起,第二個執行緒也判斷hash衝突,然後進行了插入,再切回第乙個執行緒的時候會導致直接進行插入,因為此時hash衝突已經判斷過【但此刻是形成了衝突,原來是沒有衝突的】,會導致直接插入值,將第二個執行緒插入的值覆蓋。

1.8hashmap的putval原始碼:

final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict) {

node tab; nodep; int n, i;

if ((tab = table) == null || (n = tab.length) == 0)

n = (tab = resize()).length;

if ((p = tab[i = (n - 1) & hash]) == null) // 如果沒有hash碰撞則直接插入元素

紅色**處執行緒1中斷,再返回執行,會覆蓋掉執行緒2插入的值

HashMap原始碼分析

public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...

HashMap 原始碼分析

1 getentry object key 方法 final entrygetentry object key return null 根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶 for entrye table indexfor hash,table.le...

HashMap原始碼分析

public v put k key,v value if key null return putfornullkey value int hash hash key int i indexfor hash,table.length for entrye table i e null e e.nex...