Skip to content

Latest commit

 

History

History
75 lines (51 loc) · 2.36 KB

LinkedHashSet源码分析.md

File metadata and controls

75 lines (51 loc) · 2.36 KB

简介

LinkedHashSet是一个能记录插入顺序的hashset,继承自HashSet,主要调用HashSet下面这个构造方法。

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

LinkedHashSet使用LinkedHashMap实现的,LinkedHashMap又继承自HashMap,如果你看过我写的LinkedHashMap源码分析HashSet源码分析,理解LinkedHashSet就非常容易了。


LinkedHashSet是基于双向链表和HashMap实现的,HashMap的key就是LinkedHashSet就是不重复的集合,HashMap的Value指向同一个Object实例。

源码

一共没多少源码

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

public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}

public LinkedHashSet() {
super(16, .75f, true);
}

public LinkedHashSet(Collection<? extends E> c) {
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同一个构造方法,

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

LinkedHashSet是基于LinkedHashMap实现的,就是调用HashMap,看一下他的add方法吧

add方法

他的add方法就是hashset的add方法

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

LinkedHashMap没有覆写put方法,所以还是调用HashMap的put方法,HashMap的put方法又调用了putVal方法,putVal新增结点调用了newNode方法,LinkedHashMap覆写了newNode方法,在newNode方法中实现了链表功能。