原始碼剖析 HashMap和HashSet

2021-10-10 14:18:27 字數 3302 閱讀 8169

hashmap總結

hashset

hashset總結

三個構造方法,分別是:

public

hashmap()

public

hashmap

(int initialcapacity)

public

hashmap

(int initialcapacity,

float loadfactor)

transient node

table;

transient

int size;

transient

int modcount;

int threshold;

final

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)

public

final

boolean

equals

(object o)

return

false;}

}

hashmap儲存鍵值對的過程:

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;

}

public v get

(object key)

final node

getnode

(int hash, object key)

while

((e = e.next)

!= null);}

}return null;

}

containkey方法邏輯與get類似

public

boolean

containskey

(object key)

查詢是否包含值,需要對每個值進行遍歷

public

boolean

containsvalue

(object value)}}

return

false

;

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;

}

hashset的構造方法主要就是呼叫了對應的hashmap的構造方法,如:

public

hashset()

public

hashset

(int initialcapacity)

public

hashset

(int initialcapacity,

float loadfactor)

public

hashset

(collection<

?extends

e> c)

hashset相當於只有鍵,值都是相同的固定值,值定義為

private

static

final object present =

newobject()

;

同hashmap的拓展策略

呼叫map的增加方法

public

boolean

add(e e)

呼叫map的查詢鍵的方法

public

boolean

contains

(object o)

呼叫map的刪除方法

public

boolean

remove

(object o)

迭代器返回map的迭代器

public iterator

iterator()

內部實現利用了hashmap

沒有重複元素

無序可以高效的新增、刪除元素、判斷元素是否存在,效率為 o(1)。

執行緒不安全

集合元素可以使null

HashMap底層原始碼剖析

陣列 單向鍊錶 紅黑樹 陣列 陣列每一項都是乙個鍊錶,其實就是陣列和鍊錶的結合體 單向鍊錶 當法神hash碰撞時,首先會找到陣列對應位置,然後1.8採用尾插入法 1.7採用頭插入法 形成乙個單項鍊表結構 紅黑樹 當陣列中每項的鍊錶長度大於8時,會轉換為紅黑樹 hash碰撞 不同的key可能會產生相同...

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...

HashMap原始碼系列 HashMap的屬性

public class hashmap extends abstractmap implements map,cloneable,serializable容載因子 容載因子越大,table陣列中儲存的資料越密集,碰撞的可能性就越大。容載因子越小,儲存越稀疏,碰撞的可能性就越小,不過浪費儲存空間。轉...