Set接口的哈希表和链表实现,具有可预测的迭代顺序。 此实现与HashSet 的不同之处在于它维护一个双向链表,贯穿其所有条目。
一、继承关系图
二、LinkedHashSet类介绍
1、结构
2、构造方法
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);
}
底层的数据结构是LinkedHashMap而不是HashMap,迭代的时候通过map.keySet().iterator()迭代器,这样就保证了访问的顺序了。