美文网首页
Java-HashSet源码解析

Java-HashSet源码解析

作者: zzq_nene | 来源:发表于2020-07-29 10:24 被阅读0次

HashSet是继承自AbstractSet,并且实现了Set、Cloneable、Serializable接口。
HashSet中没有重复的变量,并且遍历是无序的。是可序列化的,但是因为其内部的HashMap集合使用了transient关键字,所以是不可序列化的,序列化的只是HashMap的key和其负载系数、容量和键值对数量
HashSet源码比较简单,其内部原理实现依赖于Map集合。

1.HashSet的属性

    private transient HashMap<E,Object> map;

    // 用于作为保存在Map中的key对应的value
    // 所有的key共用一个value
    private static final Object PRESENT = new Object();

2.HashSet的构造器

    // 采用HashMap的默认容量,即16,扩容因子为0.75
    public HashSet() {
        map = new HashMap<>();
    }

    // 如果根据一个Collection创建HashMap,则根据该Collection的大小,除以0.75+1
    // 与16做比较,如果小于16,则取16,大于则取计算后的值作为容量
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

    // 自定义初始容量和负载因子的HashMap
    // 如果初始容量小于0或者负载系数小于0,则会抛出异常
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

    // 自定义初始容量的HashMap
    // 初始容量小于0会抛出异常
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

3.HashSet.add

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

4.HashSet.remove

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

相关文章

网友评论

      本文标题:Java-HashSet源码解析

      本文链接:https://www.haomeiwen.com/subject/asocrktx.html