HashMap底層原理

2021-10-09 18:45:19 字數 3582 閱讀 7576

//預設負載因子

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)

}}

自定義乙個超級基礎的hashmap
package 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值是否一致,如果不一致,那麼就在該索引位置上劃分出乙個節點來儲存當...