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源码剖析_hashset

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的源码