JDK 1.8 hashset的源码分析
/**
* hashset的特点: 无序 唯一 需要比较器 自定义<>中的内容需要实现comparable的接口 推荐外部实现:多态,自定义多种规则
* 底层实现逻辑: 数组+线性表 哈希表
* 1. 先计算出hash值 2.通过一个表达式计算出哈希表中的位置 3. 解决哈希冲突
* 通过hashmap实现hashset
*/
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
//存放集合的数据
private transient HashMap<E,Object> map;
//存放map中的value
private static final Object PRESENT = new Object();
//空的构造函数 通过实例化hashmap实现
public HashSet() {
map = new HashMap<>();
}
//复制一个集合中的元素添加到初始化hashset 默认长度是16 加载因子0.75
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//添加一个元素通过map
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
}