HashSet源码解读

概述

一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

构造方法

构造方法摘要
HashSet()
          构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
HashSet(Collection c)
          构造一个包含指定 collection 中的元素的新 set。
HashSet(int initialCapacity)
          构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
HashSet(int initialCapacity, float loadFactor)
          构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。

构造方法感觉跟hashMap是不是很像

看源码

看看hashSet源码,加上注释才312行代码-_-

属性源码

static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing HashMap instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

通过源码可以发现HashSet所有的操作都是基本HashMap的,数据存储在map当中key中,PRESENT是map中value的样板数据

仔细看比hashMap多了一个私有的构造方法,通过注释发现它是提供给LinkedHashSet使用的

/**
     * Constructs a new, empty linked hash set.  (This package private
     * constructor is only used by LinkedHashSet.) The backing
     * HashMap instance is a LinkedHashMap with the specified initial
     * capacity and the specified load factor.
     *
     * @param      initialCapacity   the initial capacity of the hash map
     * @param      loadFactor        the load factor of the hash map
     * @param      dummy             ignored (distinguishes this
     *             constructor from other int, float constructor.)
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero, or if the load factor is nonpositive
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

相关文章:

HashMap源码解读

你可能感兴趣的:(Java,hashSet)