目录
成员变量
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
private static final long serialVersionUID = -2851667679971038690L;
}
LinkedHashSet继承HashSet,其中只有序列化ID不一样,这里其实看不出什么来。
构造函数
/**
使用指定的初始容量和负载因子构造一个新的空链接散列集。
参数:
initialCapacity – 链接散列集的初始容量
loadFactor – 链接散列集的负载因子
抛出:
IllegalArgumentException – 如果初始容量小于零,或者负载因子为非正数
*/
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
/**
使用指定的初始容量和默认负载因子 (0.75) 构造一个新的空链接散列集。
参数:
initialCapacity – LinkedHashSet 的初始容量
抛出:
IllegalArgumentException – 如果初始容量小于零
*/
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}
/**
使用默认初始容量 (16) 和负载因子 (0.75) 构造一个新的空链接散列集。
*/
public LinkedHashSet() {
super(16, .75f, true);
}
/**
使用与指定集合相同的元素构造一个新的链接散列集。 链接散列集的初始容量足以容纳指定集合中的元素和默认加载因子 (0.75)。
参数:
c - 其元素将被放入此集合的集合
抛出:
NullPointerException – 如果指定的集合为空
*/
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
这里注意到它是直接继承父类的构造方法,因为有三个参数,这里实际使用的是下面HashSet中的和这个构造方法。
/**
构造一个新的空链接哈希集。 (此包私有构造函数仅供 LinkedHashSet 使用。)后备 HashMap 实例是具有指定初始容量和指定负载因子的 LinkedHashMap。
参数:
initialCapacity – 哈希映射的初始容量
loadFactor – 哈希映射的负载因子
dummy – 忽略(将此构造函数与其他 int、float 构造函数区分开来。)
抛出:
IllegalArgumentException – 如果初始容量小于零,或者负载因子为非正数
*/
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
这里就容易理解了,底层是一个LinkedHashMap。
添加/删除
添加add和删除remove操作都复用了父类HashSet的方法,详情可以看 HashSet源码剖析,这里只是底层map为LinkedHashMap。因为LinkedHashMap里面维护了一个双向链表保持着我们需要的顺序(插入顺序),所以在此LinkedHashSet运用迭代器遍历时也是有序的。