原理解釋:
//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的hashcodestatic 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 ...