学习JDK1.8集合源码之--LinkedHashSet

早过忘川 提交于 2019-12-17 18:20:39

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);
    }

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!