LinkedHashSet,底层都是通过LinkedHashMap实现的,阅读本博文前请先了解LinkedHashMap。
类结构
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable
继承了HashSet!
构造方法
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);
}
观察上诉四个构造方法可以发现,都调用了父类HashSet的构造方法。并且都是同一个构造方法。如下:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
该方法将HashSet中的HashMap成员变量的实例类型改成了LinkedHashMap类型。实例LinkedHashMap时是调用下述构造方法:
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
可以发现accessOrder一直为true。在LinkedHashMap中,accessOrder的控制双向链表记录的是请求顺序还是插入顺序,默认true是插入顺序,false是请求顺序。所以LinkedHashSet的底层双向链表的按插入顺序记录的。
增删改查
LinkedHashSet的增删改查都是调用HashSet的方法。
HashSet底层实现是调用HashMap的方法。
此时HashSet的HashMap已经被转化成LinkedHashMap实例,
所以,LinkedHashSet的增删改查都是调用LinkedHashMap的方法。