//預設負載因子
static
final
float default_load_factor =
0.75f
;//無參構造
public
hashmap()
//有參構造
public
hashmap
(int initialcapacity)
public
hashmap
(int initialcapacity,
float loadfactor)
node節點static
class
node
implements
map.entry
public
final k getkey()
public
final v getvalue()
public
final string tostring()
public
final
inthashcode()
public
final v setvalue
(v newvalue)
//equals方法,先比較位址,如果位址相同,則兩個元素一定相同;如果位址不同,則再比較key和 value,如果key和value均相同,則兩元素也相等,返回true;否則返回false。
public
final
boolean
equals
(object o)
return
false;}
}
public v put
(k key, v value)
final v putval
(int hash, k key, v value,
boolean onlyifabsent,
boolean evict)
//如果節點中有key和hash值與插入元素相等,則跳出迴圈,將節點儲存在e中
if(e.hash == hash &&
((k = e.key)
== key ||
(key != null && key.
equals
(k))))
break
;//實現鍊錶的迴圈遍歷
p = e;}}
//說明桶中有key、hash與插入元素相等的節點,進行值的替換
if(e != null)
}++modcount;if(
++size > threshold)
resize()
;afternodeinsertion
(evict)
;return null;
}//擴容方法
final node
resize()
//否則就對舊的tab進行2的冪次方擴容,即乘2
elseif(
(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;
//將原tab中的元素重新雜湊到新的tab中,其實會把原來tab中如果是沒有鍊錶形式的就放在和原tab相同的陣列索引位置,如果是鍊錶形式就將原tab中的鍊錶放在原索引+原tab長度的位置
@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;
}//將節點存入到樹中,沒有與存入節點相同的key和hash值,則直接存入,有就返回該節點
final treenode
puttreeval
(hashmap
map, node
tab,
int h, k k, v v)
dir =
tiebreakorder
(k, pk);}
treenode
xp = p;if(
(p =
(dir <=0)
? p.left : p.right)
== null)
}}
自定義乙個超級基礎的hashmappackage com.xiaokaige.map_study;
public
class
xiaokaigemap
//根據key值獲取對應的value值
public v get
(k key)
else}}
return value;
}//儲存元素
public
void
put(k key, v value)
else
else}if
(!keyrepeat)
}this
.size++;}
@override
public string tostring()
} sb.
setcharat
(sb.
length()
-1,'}');
return sb.
tostring()
;}public
intmyhash
(int v,
int length)
public
static
void
main
(string[
] args)
}
測試結果
1、經計算,69,53,85經過雜湊化之後的hash相等,存在同乙個鍊錶中
2、根據對應的鍵取出對應的值
由於hashmap的擴容機制以及負載因子、鍊錶長度達到8就會轉換成樹結構,還有一些鍵為null的情況以及remove的方法都十分繁瑣,本人能力有限,就不嘗試了。
HashMap底層原理
1.hashmap概述 hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。2.hashmap的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...
HashMap底層原理
hashmap實現map介面,非執行緒安全的,區別於concurrenthashmap。允許使用null值和null鍵,不保證對映的順序.底層資料結構是乙個 陣列 鍊錶 紅黑樹 put 根據key計算得到key.hash h k.hashcode h 16 根據key.hash計算得到桶陣列的索引i...
HashMap底層原理
1.8之前 hashmap在儲存元素時,首先會獲取元素的雜湊值結合位移運算,計算出該元素在陣列中的位置,如果當前位置沒有元素,就在該位置直接新增元素,如果該位置已存在其他元素,就會呼叫hashcode方法,來比較元素的hashcode值是否一致,如果不一致,那麼就在該索引位置上劃分出乙個節點來儲存當...