概述
在分析hashset原始碼前,先看看hashset的繼承關係
hashset繼承關係
從上圖可以看出,hashset繼承自abstractset,實現了set介面,接著看一下原始碼中的注釋
this class implements the set inte***ce, backed by a hash table
(actually a hashmapinstance). it makes no guarantees as to the
iteration order of the set; in particular, it does not guarantee that the
order will remain constant over time. this class permits the null element.
hashset實現了set介面,內部有乙個雜湊表支撐(實際上就是乙個hashmap例項),它不保證迭代的順序;尤其是,隨著時間的變化,它不能保證set的迭代順序保持不變。允許插入空值。
到此發現,hashset實際上可以拆分成hash跟set,hash指的是hashmap,set則是指實現了set介面,這樣看來,hashset的實現其實就比較簡單了,下面開始分析原始碼。
正文
成員變數
//序列化id
static final long serialversionuid = -5024744406713321676l;
//內建的hashmap
private transient hashmapmap;
// 就是乙個傀儡,填充hashmap的value而已,沒有實際意義
private static final object present = new object();
構造方法空的構造方法初始化乙個空的hashmap
public hashset()
帶有容量的構造方法
hashmap給定乙個容量
public hashset(int initialcapacity)
帶有容量跟負載因子的構造方法public hashset(int initialcapacity, float loadfactor)帶有容量跟負載因子,以及value型別區分dummy作為value是基本型別跟引用型別,注意此處初始化的是乙個linkedhashmap
hashset(int initialcapacity, float loadfactor, boolean dummy)
通過乙個集合初始化
public hashset(collection extends e> c)
呼叫addall方法
public boolean addall(collection extends e> c)
增加元素新增乙個元素,如果map中存在,返回false,否則返回true
public boolean add(e e)
看一下map的put方法
public v put(k key, v value)
if (key == null)
return putfornullkey(value);
int hash = sun.misc.hashing.singlewordwangjenkinshash(key);
int i = indexfor(hash, table.length);
for (hashmapentrye = table[i]; e != null; e = e.next)
}modcount++;
addentry(hash, key, value, i);
return null;
}
所以set元素必須複寫hashcode跟equals方法,不然會導致元素錯亂
刪除元素
public boolean remove(object o)
clearpublic void clear()contains方法
public boolean contains(object o)
isempty
public boolean isempty()
迭代public iteratoriterator() 分析了一下,其實最終的底層實現都是在呼叫hashmap的方法,所以了解了hashmap的原始碼之後,hashset其實就會比較簡單了
總結
hashset是非執行緒安全的,允許插入空元素
hashset不允許重複元素
hashset的key需要複寫hashcode跟equals方法
Java原始碼分析之HashSet
hashset的本質,其實就是hashmap private transient hashmapmap hashmap是鍵值對,而hashset是單值,所以需要乙個值來充當鍵值對中的值 private static final object present new object public has...
Java類集框架 HashMap原始碼分析
hashmap是基於map的鍵值對對映表,底層是通過陣列 鍊錶 紅黑樹 jdk1.8加入 來實現的。hashmap結構 hashmap中儲存元素,是將key和value封裝成了乙個node,先以乙個node陣列的來儲存,通過key的hashcode來計算hash值,根據hash值和hashmap的大...
Java類集框架 HashMap原始碼分析
hashmap是基於map的鍵值對對映表,底層是通過陣列 鍊錶 紅黑樹 jdk1.8加入 來實現的。hashmap結構 hashmap中儲存元素,是將key和value封裝成了乙個node,先以乙個node陣列的來儲存,通過key的hashcode來計算hash值,根據hash值和hashmap的大...