HashMap中get put方法原始碼分析

2021-10-08 06:22:30 字數 1821 閱讀 5709

無序,儲存與取出的順序不相同;不可重複,儲存的資料不能重複。

底層資料結構為雜湊表,雜湊表又稱為雜湊表,是由陣列和單向鍊錶的組合形成的資料結構。jdk8之後,當鍊表長度達到8時,則會轉化為紅黑樹。

1、put(k, v)

第一步:先將key,value封裝到乙個node節點中。

第二步:底層呼叫hashcode()計算hash的值,並通過雜湊函式的演算法將hash值轉化為陣列下標,如果下標位置上沒有任何元素,就把node新增到這裡;如果下標位置上有鍊錶,會用指定key與鍊錶上的節點中的key進行比對,如果相同,則將value覆蓋,如果不同,就將這個新節點新增在這個鍊錶的末尾。

2、get(k)

通過hashcode()方法計算出指定key對應的hash值,再通過雜湊演算法將其轉化為陣列下標,然後通過陣列下標找到雜湊表中陣列對應的位置,如果這個位置上什麼都沒有,則返回null;如果有單向鍊錶,再通過equals方法對比這個下標所在的位置上的鍊錶中的所有節點的key值,如果所有都返回false,則返回null,如果指定key值與某個節點的key通過equals方法返回true,則將這個節點的value值返回。

綜上,注意放在hashmap中key部分的元素和hashset中的元素,要同時重寫hashcode()和equals()。

hashmap的初始化容量為16,指定容量時必須是2的倍數,這是因為達到雜湊均勻同時為了提高hashmap的訪問效率。預設載入因子是0.75。

​ 預設載入因子是指 當hashmap集合底層雜湊表中的陣列容量達到75%時,陣列開始擴容。

jdk8之後,hashmap中單鏈表的長度大於8時,會將其改為紅黑樹的資料結構,小於6的時候會變回單向鍊錶。為了提高檢索效率。

1、get

public v get

(object key)

final node

getnode

(int hash, object key)

while

((e = e.next)

!= null);}

}return null;

}

2、put

public v put

(k key, v value)

final v putval

(int hash, k key, v value,

boolean onlyifabsent,

boolean evict)

//判斷鍊錶中是否存在這個結點,如果存在直接跳出迴圈修改value

if(e.hash == hash &&

((k = e.key)

== key ||

(key != null && key.

equals

(k))))

break

; p = e;

//與前面的判斷中e=p.next配合遍歷鍊錶}}

//桶中存在與新插入的結點key、hash值相同的結點(結點已存在)

if(e != null)

}++modcount;

//插入後實際大小大於閾值則重新擴容if(

++size > threshold)

resize()

;afternodeinsertion

(evict)

;return null;

}

分析不到位的地方望大家多多指正!

HashMap原始碼複習之putVal 方法

putval 方法 hash key的hash值 key 原始key value 要存放的值 onlylfabsent 如果true代表不更改現有的值 evict 如果為false表示table為建立狀態 final v putval int hash,k key,v value,boolean o...

JDK8 HashMap原始碼解析 put方法

一 概述 map的put方法接受兩個引數,key和value,該方法用於儲存鍵值對。hashmap的put方法只有一行 return putval hash key key,value,false,true 參見 hash方法解析hash方法解析可知put方法是乙個方便使用者使用的快捷方式,具體邏輯...

java中怎麼遍歷HashMap

1.hashmap staff new hashmap 新增關鍵字值對,自己寫遍歷 set entries staff.entryset iterator iter entries.iterator while iter.hasnext 2.map map new hashmap for itera...