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;
    }
}

posted @ 2023-01-18 16:17  李悠然  阅读(14)  评论(0编辑  收藏  举报