HashMap原始碼解析

2021-10-09 17:55:12 字數 1916 閱讀 4414

原理解釋:

//node的hashcode計算

public final int hashcode()

public final k getkey()

public final v getvalue()

...}

//計算key的hashcode

static final int hash(object key)

//資料組

transient node table;

//此雜湊對映在結構上被修改的次數

transient int modcount;

//下乙個要調整大小的值(容量*載入係數)

int threshold;

//雜湊表的載入因子

final float loadfactor;

//g建構函式

public hashmap(int initialcapacity, float loadfactor){}

//雙向列表結構定義

static final class treenodeextends linkedhashmap.entry

//放值

public v put(k key, v value)

//計算key的hashcode 

static final int hash(object key)

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

boolean evict)

//根據table的大小判斷儲存的位置有沒有資料 沒有直接放入

if ((p = tab[i = (n - 1) & hash]) == null)else

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;}}

v oldvalue = e.value;

if (!onlyifabsent || oldvalue == null)

e.value = value;

afternodeaccess(e);

return oldvalue;}}

//更新修改次數

++modcount;

//重新計算hashmap資料

if (++size > threshold)

resize();

afternodeinsertion(evict);

return null;

}

//紅黑樹的問題

final void treeifybin(node tab, int hash) 

tl = p;

} while ((e = e.next) != null);

if ((tab[index] = hd) != null)

//關鍵方法

hd.treeify(tab);}}

//紅黑樹實現

final void treeify(node tab)

else }}

}moveroottofront(tab, root);

}

HashMap原始碼解析

以jdk1.8為例,hashmap是乙個用於儲存key value鍵值對的集合,每乙個鍵值對是乙個node jdk1.7叫做entry 後台是用乙個node陣列來存放資料,這個node陣列就是hashmap的主幹。這裡我們主要來分析hashmap的get和put方法。public v put k k...

hashMap 原始碼解析

這幾天跳槽 被人問得最多的問題就是基礎方面的知識.當時學習的時候有點囫圇吞棗.現在回頭把這些基本的集合類原始碼都仔細閱讀下 hashmap 用的是最頻繁的.所以問得也最多了.initcapacity 初始化的容量 loadfacotr 負載因子 主要用來計算threshold的值 threshold...

HashMap原始碼解析

預設字段 static final int default initial capacity 1 4 預設node的陣列長度 16 static final int maximum capacity 1 30 陣列的最大長度 2 30 static final float default load ...