Java容器類框架分析 5 HashSet原始碼分析

2021-09-14 08:06:08 字數 2784 閱讀 1702

概述

在分析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的大...