HashSet源码剖析
原创
©著作权归作者所有:来自51CTO博客作者wx63118e2bb7416的原创作品,请联系作者获取转载授权,否则将追究法律责任
HashSet特点
set集合是一个具有去重功能的容器,不允许集合中出现重复元素,由hashMap实现,所以不保证元素的顺序
HashSet源码定义
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map; //可以看出底层由HashMap实现
从HashSet的定义中可以看到:继承自AbstractSet ,实现Set,Cloneable(克隆),Serializable(序列话)接口
构造函数
无参构造
public HashSet() {
map = new HashMap<>();
}
初始化容器构造器
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
几何形式构造器
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
三个参数构造器:
- 初始化容量,负载因子, 第三个dummy 好像无任何作用,目前没有使用
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
常用API
- 都很简单,一看便知作用
HashSet特点
- 非线程安全
如果希望变为线程安全的set,可以使用Collections.synchronizedSet(set)变为线程安全的hashSet
Set<String> set = Collections.synchronizedSet(new HashSet<>());
put方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
hashSet由hashmap实现,add添加数据时,key为实际存储的值,value是PRESENT是一个final static 的object()对象
private static final Object PRESENT = new Object();
其他主要源码基本上都是直接调用map的相关接口…可以直接看map的源码