無序,儲存與取出的順序不相同;不可重複,儲存的資料不能重複。
底層資料結構為雜湊表,雜湊表又稱為雜湊表,是由陣列和單向鍊錶的組合形成的資料結構。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...