輕鬆理解HashMap的實現原理

2021-10-03 17:11:43 字數 2475 閱讀 7130

按照常規流程:

例項化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...