java 集合源码探究之 HashSet ,基于 HashMap实现

    科技2022-07-12  115

    类信息

    hashset 的底层是由hashmap实现 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; private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); } }

    构造函数

    直接使用HashMap指定HashMap的初始化容量以及负载因子指定HashMap的初始化容量 public HashSet() { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); }

    添加元素

    hashmap中的key是不能重复的, 所以就用它来作为set集合的存储, 而map中的value值则为一个空对象。

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

    删除元素

    直接使用内部map的方法删除

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

    判断空

    public boolean isEmpty() { return map.isEmpty(); }

    包含元素

    public boolean contains(Object o) { return map.containsKey(o); }

    迭代器

    直接返回的是Map, key的迭代器

    public Iterator<E> iterator() { return map.keySet().iterator(); }

    小总结

    HashSet的方法实现都借助HashMap来完成的, 所有它的学习就是在学习Hashmap

    Processed: 0.014, SQL: 8