LinkedHashSet 的实现原理

public class LinkedHashSet    extends HashSet    implements Set, Cloneable, java.io.Serializable {   
    private static final long serialVersionUID = -2851667679971038690L;    
    /**     
     * Constructs a new, empty linked hash set with the specified initial     
     * capacity and load factor.     *     
     * @param      initialCapacity the initial capacity of the linked hash set     
     * @param      loadFactor      the load factor of the linked hash set     
     * @throws     IllegalArgumentException  if the initial capacity is less     
     * than zero, or if the load factor is nonpositive     
     */    
    public LinkedHashSet(int initialCapacity, float loadFactor) {        
        super(initialCapacity, loadFactor, true);    
    }    
    /**     
      * Constructs a new, empty linked hash set with the specified initial     
      * capacity and the default load factor (0.75).     
      *     
      * @param   initialCapacity   the initial capacity of the LinkedHashSet     
      * @throws  IllegalArgumentException if the initial capacity is less     
      * than zero    
      * LinkedHashSet是基于HashSet, LinkedHashMap实现的,因为super其实是
      */    
    public LinkedHashSet(int initialCapacity) {          
        super(initialCapacity, .75f, true);    
    }    
    /**     
      * Constructs a new, empty linked hash set with the default initial     
      * capacity (16) and load factor (0.75).     
      */    
    public class LinkedHashSet
    extends HashSet
    implements Set, Cloneable, java.io.Serializable {

    private static final long serialVersionUID = -2851667679971038690L;

    /**
     * 构造一个带有指定初始容量和加载因子的新空链接哈希set。
     *
     * 底层会调用父类的构造方法,构造一个有指定初始容量和加载因子的LinkedHashMap实例。
     * @param initialCapacity 初始容量。
     * @param loadFactor 加载因子。
     */
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

    /**
     * 构造一个带指定初始容量和默认加载因子0.75的新空链接哈希set。
     *
     * 底层会调用父类的构造方法,构造一个带指定初始容量和默认加载因子0.75的LinkedHashMap实例。
     * @param initialCapacity 初始容量。
     */
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }

    /**
     * 构造一个带默认初始容量16和加载因子0.75的新空链接哈希set。
     *
     * 底层会调用父类的构造方法,构造一个带默认初始容量16和加载因子0.75的LinkedHashMap实例。
     */
    public LinkedHashSet() {
        super(16, .75f, true);
    }

    /**
     * 构造一个与指定collection中的元素相同的新链接哈希set。
     *
     * 底层会调用父类的构造方法,构造一个足以包含指定collection
     * 中所有元素的初始容量和加载因子为0.75的LinkedHashMap实例。
     * @param c 其中的元素将存放在此set中的collection。
     */
    public LinkedHashSet(Collection c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }
}
/**
     * 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。
     * 此构造函数为包访问权限,不对外公开,实际只是是对LinkedHashSet的支持。
     *
     * 实际底层会以指定的参数构造一个空LinkedHashMap实例来实现。
     * @param initialCapacity 初始容量。
     * @param loadFactor 加载因子。
     * @param dummy 标记。
     */
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap(initialCapacity, loadFactor);
}

在父类 HashSet 中,专为 LinkedHashSet 提供的构造方法如下,该方法为包访问权限,并未对外公开。

由上述源代码可见,LinkedHashSet 通过继承 HashSet,底层使用 LinkedHashMap,以很简单明了的方式来实现了其自身的所有功能。

所以我们需要注意的点是:

  • LinkedHashSet 是 Set 的一个具体实现,其维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。
  • LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的(具体的区别大家可以自己去思考一下)。
  • 如果我们需要迭代的顺序为插入顺序或者访问顺序,那么 LinkedHashSet 是需要你首先考虑的

你可能感兴趣的:(LinkedHashSet 的实现原理)