按照常規流程:
例項化hashmap物件時:
hashmaphashmap = new hashmap<>();
從**中可以看出
只是將負載因子設定為預設的0.75,並未作其他的操作。此時的hashmap還是乙個空的map。
那麼,hashmap是在什麼時候設定容量的呢?
put方法中呼叫了putval方法,其中呼叫了雜湊演算法hash()。
雜湊演算法:首先呼叫object的hashcode()方法算出key的雜湊值,該方法在native層實現。接著將key的雜湊值(int型32位)無符號右移16位,即取它的高16位返回,右移後高16位變成0,原高16位移動到低16位。問題:為什麼雜湊演算法要雜湊值和其高16位進行異或運算?
// 已經往尾結點插入資料了,跳出迴圈
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;}}
//2 儲存value
v oldvalue = e.value;
if (!onlyifabsent || oldvalue == null)
e.value = value;
afternodeaccess(e);
return oldvalue;}}
++modcount;
//3 每次put元素都會判斷要不要擴容。如果元素的數量大於閾值,則擴容
if (++size > threshold)
resize();
//linkedhashmap使用
afternodeinsertion(evict);
return null;
}問題1:擴容時,原陣列中的元素會怎麼插入到新的陣列中?
/**
* 初始化或將表大小加倍。如果為null,則按照字段閾值中儲存的初始容量目標進行分配。
* 否則,因為我們使用二次冪擴充套件,來自每個bin的元素必須保持在相同的索引,或者在新錶中以兩個偏移的冪移動。
*/final node resize() else if ((newcap = oldcap << 1) < maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr << 1; // double threshold
} else if (oldthr > 0) // initial capacity was placed in threshold
newcap = oldthr;
else
if (newthr == 0)
threshold = newthr;
//擴容時都會建立乙個新的陣列,長度為原先的兩倍
@suppresswarnings()
node newtab = (node) new node[newcap];
table = newtab;
if (oldtab != null) else
} while ((e = next) != null);
if (lotail != null)
if (hitail != null) }}
}}return newtab;
}
整體流程:先根據雜湊演算法獲取雜湊值,以此找到陣列的索引,然後根據索引找到鍊錶,判斷頭結點是不是要找的元素,不是再判斷是紅黑樹還是鍊錶,如果是鍊錶,則從頭結點開始往尾結點找,那麼,問題來了,紅黑樹怎麼找?
問題1:紅黑樹怎麼找???
/**
* 返回指定鍵對映到的值,如果此對映不包含鍵的對映,則返回。
* 更正式地說,如果此對映包含從金鑰到值的對映,
* 使得,那麼這個方法返回,否則返回。
* (最多只能有乙個這樣的對映。)。
* 的返回值不一定表示地圖不包含鍵的對映;也有可能對映將鍵明確對映到。
* 操作可用於區分這兩種情況。
*/public v get(object key)
final nodegetnode(int hash, object key) while ((e = e.next) != null);}}
return null;
}
輕鬆理解MYSQL MVCC 實現機制
支援原創,大家去看原文吧 1.1 什麼是mvcc mvcc是一種多版本併發控制機制。1.2 mvcc是為了解決什麼問題?1.3 mvcc實現 mvcc是通過儲存資料在某個時間點的快照來實現的.不同儲存引擎的mvcc.不同儲存引擎的mvcc實現是不同的,典型的有樂觀併發控制和悲觀併發控制.下面,我們通...
輕鬆理解MYSQL MVCC 實現機制
大家都應該知道,鎖機制可以控制併發操作,但是其系統開銷較大,而mvcc可以在大多數情況下代替行級鎖,使用mvcc,能降低其系統開銷.start transaction insert into yang values null,yang insert into yang values null,lon...
HashMap類的理解
hashmap是乙個雜湊表,它的儲存內容是鍵值對。紫色部分代表雜湊表,每個元素後面都是乙個單鏈表的頭結點。原始碼分析 上面原始碼,hashmap初始容量為 4個,最大容量為2的 30次冪,增長因子為 0.75 在進行擴容時,擴容數量 增長因子 當前容量。第 90行,為對應的 hash 表 hashm...