Java - HashSet 源码阅读笔记

in Tech Java

简介

HashSet实现了Set接口,只能用于存储不重复的对象。内部使用HashMap中的Key来存储数据,Value则存储了同一个Object对象。理解了HashMap之后,再看HashSet源码就相当简单了。

源码

构造方法

    public HashSet() {
        // 实例化一个Map对象
        map = new HashMap<>();
    }
    public HashSet(int initialCapacity, float loadFactor) {
        // 可以指定初始容量,加载因子
        map = new HashMap<>(initialCapacity, loadFactor);
    }
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }
    // 此构造方法给 LinkedHashSet 使用
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

新增or修改节点

    // 直接将值当做Map的key来进行保存,因为map里的key如果相同的话则视为更新操作
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

删除节点

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }