欢迎大家关注我的GitHub:github.com/hsfxuebao/j… ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈
HashSet概述
HashSet的代码行数 300多行,是我见过最少代码的集合了,非常简单,它有以下的特点
- 没有重复元素的集合。底层基于HashMap来实现。
- 非线程安全,创建线程安全的HashMap可以使用Collections.synchronizedSet。
HashSet源码解读
继承关系
- 继承AbstractSet抽象类,实现Set接口
- 实现java.io.Serialization接口,支持序列化
- 实现Cloneable接口,支持对象克隆,浅复制
属性
//使用HashMap来保存HashSet的元素
private transient HashMap<E,Object> map;
//HashSet只使用到key,因此使用一个静态常量来充当HashSet的value值
private static final Object PRESENT = new Object();
复制代码构造方法
//使用默认容量大小16以及加载因子0.75初始化HashMap,构造HashSet
public HashSet() {
map = new HashMap<>();
}
//初始化指定集合和默认加载因子0.75的map,构造HashSet
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//使用指定容量大小和加载因子初始化map,构造HashSet
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//使用指定容量大小和默认加载因子0.75初始化map,构造HashSet
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
//包访问权限,构造空的LinkedHashSet
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
复制代码方法
- size()方法:内部调用Map的size方法。
public int size() {
return map.size();
}
复制代码- isEmpty()方法,也是调用map,里面是通过判断size是否为0来判断是否为null
public boolean isEmpty() {
return map.isEmpty();
}
复制代码- add()方法 HashSet的add方法内部通过HashMap.put()方法来实现key的添加,在HashMap内部真正执行的是putVal()方法,putVal这边就不说了 HashMap讲过
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
复制代码总结
HashSet 还真没啥讲了 ,就是把HashMap的key 拿来当数据存,基本上都是调用的是HashMap的方法,所以说讲的也少,总结一下吧
- HashSet的实现支持null的key,同时HashSet的内部不支持重复的key
- 不重复
- 线程不安全