学习JDK8源码之--LinkedHashSet

1. LinkedHashSet简介

  LinkedHashSet继承自HashSet,故拥有HashSet的全部API,LinkedHashSet内部实现简单,核心参数和方法都继承自HashSet,只是重写了spliterator一个方法。

  HashSet底层通过HashMap进行数据存储,而LinkedHashSet则是通过LinkedHashMap进行数据存储,故LinkedHashSet是一个有序的不可重复集合,非线程安全。

2. LinkedHashSet实现

//继承自HashSet,实现了Set、Cloneable、java.io.Serializable接口
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable { private static final long serialVersionUID = -2851667679971038690L;
   //传入初始容量和加载因子 public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true); }
   //传入初始容量,加载因子默认0.75 public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); }
   //无参构造,默认初始容量16,加载因子0.75 public LinkedHashSet() { super(16, .75f, true); }
   //传入一个集合 public LinkedHashSet(Collection<? extends E> c) {
     //初始容量取集合c大小的2倍与11的最大值,加载因子0.75 super(Math.max(2*c.size(), 11), .75f, true);
     //将集合内所有元素添加进来 addAll(c); } @Override public Spliterator<E> spliterator() { return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED); } }

  LinkedHashSet的源码很少,构造方法都是调用的父类HashSet的同一个构造方法,而这个构造方法也只是提供给LinkedHashSet使用的。

  LinkedHashSet和HashSet的唯一区别就是底层由LInkedHashMap存储数据,从而保证了有序性。

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

  

上一篇:HashSet,TreeSet和LinkedHashSet的区别


下一篇:随机打印0-100的全部数字并且不可重复,时间复杂度为O(n)