JDK14 0 1 HashSet原始碼總結

2021-10-12 07:25:12 字數 2559 閱讀 3644

目錄

1.概述

2.屬性

3.構造方法

4.相關操作

4.1新增元素

4.2移除元素

4.3遍歷、判空、包含

5.轉殖機制(淺拷貝)

6.序列化機制

7.去重機制

此類實現set介面,該介面由雜湊表(實際上是hashmap例項)支援。其依靠hashmap的key不可重複,來保證將來加入到hashset中的元素也不重複,也保證元素最多只能有乙個null值,由於hashmap的key是無序存放的,所以hashset的元素同樣也是無序的。 它不保證集合的迭代順序。 特別是,它不能保證順序會隨著時間的推移保持恆定,此類允許使用null元素。

對此集合進行迭代需要的時間與hashset例項的大小(元素的數量)加上後備hashmap例項的「容量」(儲存桶的數量)之和成比例。 因此,如果迭代效能很重要,則不要將初始容量設定得過高(或負載因子過低),這一點非常重要。

請注意,此實現未同步。 如果多個執行緒同時訪問雜湊集,並且至少有乙個執行緒修改了雜湊集,則必須在外部對其進行同步。

其實現了 cloneable介面與serializable介面,是可轉殖和可序列化的。

//其中key存放元素值,value中的值全部指向共享虛擬值

private transient hashmapmap;

//虛擬值,共享所有key的value,為了省去判null操作而增加乙個共享靜態object物件

private static final object present = new object();

//預設構造方法,新建乙個hashmap,預設負載因子0.75,容量16

public hashset()

//構造乙個新集合,其中包含指定集合中的元素。 使用預設的載入因子(0.75)和足以容納指定集合中的元素的初始容量建立hashmap

public hashset(collection extends e> c)

//構造乙個新的空集,支援的hashmap例項具有指定的初始容量和指定的負載係數

public hashset(int initialcapacity, float loadfactor)

//構造乙個新的空集,支援的hashmap例項具有指定的初始容量和預設負載因子(0.75)

public hashset(int initialcapacity)

//構造乙個新的空鏈結雜湊集。

//不對外公開的構造方法,default修飾,實際上是提供給linkedhashset使用

//dummy引數無實際意義,僅作標識作用(為了和上面第三個構造方法進行區分)

//支援的hashmap例項是具有指定的初始容量和指定的負載因子的linkedhashmap。

hashset(int initialcapacity, float loadfactor, boolean dummy)

//呼叫hashmap中的put方法

public boolean add(e e)

//呼叫hashmap中的renmove方法,刪除key值節點

public boolean remove(object o)

//刪除所有的節點,即清空map

public void clear()

在hashset中,因為其使用的是hashmap結構,並且其value均為虛擬值(屬性中指明),這也決定了hashset中是不重複的並且key是無序的,由於獲取key返回位置和返回value都是沒有任何意義的,因此hashset中並沒有獲取元素的操作。

其中提供了遍歷、判空、包含等操作:

//呼叫hashmap中的迭代器,通過迭代器可以進行遍歷操作

public iteratoriterator()

//判斷該hashset是否為空

public boolean isempty()

//呼叫hashmap中containskey方法判斷hashset中是否包含某一key

public boolean contains(object o)

//返回此hashset例項的淺表副本:元素本身未轉殖

public object clone() catch (clonenotsupportedexception e)

}

實現了serializable介面,並重寫了序列化與反序列化,序列化時直接呼叫重寫後的方法。**較長,這裡就不放了,感興趣的小夥伴可以翻開原始碼閱讀。

因為hashset是基於hashmap所實現的資料結構,因此其底層是與hashmap具有一樣的性質。為了保證hashset的不重複性,所有key對應的value都設定了共享同乙個object物件,因此同乙個key加入到hashmap中,永遠都是同乙個key-value鍵值對。

JDK原始碼之HashSet

1.定義 hashset繼承abstractset類,實現set,cloneable,serializable介面。set 介面是一種不包括重複元素的 collection,它維持它自己的內部排序,所以隨機訪問沒有任何意義。public class hashsetextends abstractse...

HashSet原始碼解析 JDK1 8

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

JDK13 HashMap resize原始碼解析

resize是重新雜湊,所以要在現在容量和閾值的基礎上獲取新的容量和閾值,函式首先進行了變數定義 final hashmap.node resize else if newcap oldcap 1 maximum capacity oldcap default initial capacity de...