基於jdk1 8的HashSet的原始碼分析

2021-10-04 02:13:18 字數 2087 閱讀 2721

1.1:hashset的成員屬性

//使用hashmap用來儲存元素

private

transient hashmap

map;

//因為hashset只用key儲存資料,所以這個變數用來向map中儲存資料時代替value

private

static

final object present =

newobject()

;

1.2:hashset的構造方法
//方法一:通過例項化hashmap來實現

public

hashset()

//方法二:通過傳入集合來實現

public

hashset

(collection<

?extends

e> c)

//新增元素

public

boolean

addall

(collection<

?extends

e> c)

//方法三:通過指定容量大小和載入因子初始化hashmap來實現

public

hashset

(int initialcapacity,

float loadfactor)

//方法四:指定容量大小初始化hashmap來實現

public

hashset

(int initialcapacity)

1.3:hashset的常用方法

1.3.1:add(e e) 方法

//可以看出底層也是通過hashmap的put方法來實現的

//hashmap的put方法返回的是要麼是舊值要麼是null

//present初始化是null並且不會改變,所以這個值一直是null,因此put方法返回的就一直是null

public

boolean

add(e e)

1.3.2:remove(object o) 和 clear()方法
//可以看出底層也是通過hashmap的remove方法來實現的

//map的remove方法的返回的是被刪除鍵對應的值,儲存的時候是null

public

boolean

remove

(object o)

public

void

clear()

1.3.3:contains(object o)方法
//可以看出底層也是通過hashmap的containskey方法來實現的

public

boolean

contains

(object o)

1.3.4:isempty()方法
//可以看出底層也是通過hashmap的isempty方法來實現的

public

boolean

isempty()

1.3.5:clone()方法
/**

* 可以看出使用的是object的clone()方法來實現的,得到object物件後強轉成hashset* 接著通過呼叫的hashmap的clone()方法把它的底層實現hashmap也轉殖乙份,並賦值給newset返回

*/public object clone()

catch

(clonenotsupportedexception e)

}

2.1:為什麼使用hashset?

解析:和linkedlist和arraylist的查詢速度相比,hashset更快。通過上面分析我們知道hashset是基於hashmap實現的,並且hashset只儲存key,value是null,當我們去獲取資料的時候,就只用根據雜湊值計算陣列下標,從而獲取值,速度很快。而linkedlist是基於鍊錶的形式,查詢需要逐級遍歷,效率低。arraylist如果不知道元素的的具體位置,還是要全部遍歷直到查到結果,效率一樣低。

2.2:總結

HashSet原始碼解析 JDK1 8

在我們學過hashmap之後,再來看hashset就很easy了。因為hashset是基於hashmap是實現的。開啟hashset的原始碼,可以看到維護了乙個hashmap 一 成員變數 用來儲存 hashset 的元素private transient hashmap,object map 這個...

基於JDK1 8的LinkedList剖析

之前寫了一篇arraylist,那麼今天就寫一篇他的姊妹篇,linkedlist。眾所周知,arraylist底層資料是陣列,可以在o 1 的時間內get到資料,但刪除和插入就要o n 時間複雜度。所以出現了鍊錶,鍊錶可以在o 1 的時間內插入,並且不會浪費記憶體,用多少就鏈結多少即可。我們從以下幾...

HashMap原始碼分析 基於jdk1 8

初始化 描述 hashmap構造方法一公共有4個,分別如下 無參構造 public hashmap 給定初始容量 param initialcapacity public hashmap int initialcapacity 指定初始容量和載入因子 param initialcapacity pa...