HashMap底層實現

2021-10-03 11:43:14 字數 1905 閱讀 2506

hashmap中定義了乙個node結構,很明顯可以看出這是乙個鍊錶的節點定義。鍵值對key和value以及key的hash值都儲存在這個節點中

static

class

node

implements

map.entry

}

hashmap的插入方法在key值已存在的時候是直接替換掉value值,若key值不存在才執行插入,插入方法定義如下

public v put

(k key, v value)

final v putval

(int hash, k key, v value,

boolean onlyifabsent,

boolean evict)

if(e.hash == hash &&

((k = e.key)

== key ||

(key != null && key.

equals

(k))))

break

; p = e;}}

if(e != null)

}++modcount;if(

++size > threshold)

resize()

;afternodeinsertion

(evict)

;return null;

}

可以看出hashmap插入的步驟如下:

首先判斷hash表是否存在,若不存在則建立乙個;

再通過hash值找到對應的位置,如果該位置為空,那麼就以插入值為頭節點建立乙個新鍊錶;

判斷表頭的key值是否與插入key值相同,若相同則替換value值,然後判斷是否是紅黑樹結構,若是,則呼叫紅黑樹的插入方法,若不是,則可判斷它是鍊錶,接下來從頭遍歷到尾,若找到與插入key值相同的節點,則替換value值,否則在末尾插入乙個新的節點,若鍊錶長度達到所定的閾值(預設為8),則將其轉換成一顆紅黑樹。

取出的**如下:

public v get

(object key)

final node

getnode

(int hash, object key)

while

((e = e.next)

!= null);}

}return null;

}

查詢的步驟很簡單,先判斷表是否存在或者為空,再判斷頭節點是否是所要查詢的節點,若不是,則根據根據是紅黑樹還是鍊錶來進行查詢。

刪除的**如下:

public v remove

(object key)

final node

removenode

(int hash, object key, object value,

boolean matchvalue,

boolean movable)

p = e;

}while

((e = e.next)

!= null);}

}if(node != null &&

(!matchvalue ||

(v = node.value)

== value ||

(value != null && value.

equals

(v))))

}return null;

}

刪除的步驟如下:

首先判斷表是否存在,否則返回null;

再判斷刪除節點是頭節點,還是紅黑樹中的節點,又或者是鍊錶中間位置的節點,根據3種情況分別進行操作,其中紅黑樹刪除節點後在元素少於閾值的時候會轉換成鍊錶結構。

如有錯誤,請進行指正。

hashmap底層實現原理

每次初始化hashmap都會構造乙個table陣列,而table陣列的元素為entry節點。static class entryimplements map.entryhashmap也可以說是乙個陣列鍊錶,hashmap裡面有乙個非常重要的內部靜態類 entry,這個entry非常重要,它裡面包含了...

HashMap底層實現分析

1.1 建立 mappersonmap new hashmap 在堆記憶體開闢空間。成員變數transient node table,transient代表不會被序列化,預設為null。static class node implements map.entry public final k get...

HashMap的底層實現

hashmap底層是使用陣列和鍊錶結合在一起使用,即鍊錶雜湊。hashmap通過key的hashcode經過擾動函式hash int h 處理後得到hash值,然後通過 n 1 hash 確定該元素存放的位置,if 當前位置已存在元素,就判斷當前位置的元素hash值以及key 是否相同,如果相同則直...