目录
注:阅读本文之前,需要对HashMap有一定基础,移步此文 HashMap底层源码 细致解读
一、概述
HashSet
是实现Set
接口,底层数据结构是哈希表HashMap
,它保存的元素都是非重复的元素,但是不保证迭代的顺序。
对于HashSet
而言,它是基于HashMap
实现,所有元素都存放在HashMap
的Key
中,这也是为什么HashSet
没有重复元素的原因。
因为HashSet
底层使用HashMap
来保存所有元素,相关HashSet
的的操作基本上都是调用HashMap
的相关方法直接完成,因此HashSet
的实现比较简单,相关源代码也比较简单比较少。
总结HashSet特点:
- 底层数据结构是基于
HashMap
实现的 - 集合里面是没有重复元素的
- 线程不安全
- 允许使用
null
作为元素
二、源码解读
注:不同jdk版本的源码会有一定差异,不过大致上是相同的,我使用的是 openjdk version “1.8.0_342”。
类图
成员变量
// HashMap用于存储操作,HashSet底层封装类对象
private transient HashMap<E,Object> map;
// HashSet是将元素存放在HashMap的key中,因此使用一个静态常量来充当HashMap的value值
private static final Object PRESENT = new Object();
构造方法
构造方法1:public HashSet()
创建一个空的HashMap,一个空HashMap的默认容量是16,装载因子是0.75
public HashSet() {
map =