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...