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 是否相同,如果相同則直...