说明
- LinkedHashSet是HashSet的子类,扩容机制一样,因子也是0.75;
- LinkedHashSet底层是一个LinkedHashMap;
- 线程不安全;
- 第一次添加时候,直接将table数组扩容到16;
public LinkedHashSet() {
//默认初始容量是16,默认加载因子是0.75
super(16, 0.75F, true);
}
//super
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
this.map = new LinkedHashMap(initialCapacity, loadFactor);
}
- LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的;
- LinkedHashSet不允许添加重复元素;
源码说明
LinkedHashSet除了几个构造函数, 基本上都是调用父类HashSet的构造函数;
- LinkedHashSet 中维护了一个hash表和双向链表(LinkedHashSet有head头节点和tail尾节点)
- 数组类型是HashMapEntry,每个节点有个before和after属性,指向前节点和后节点
- 在添加一个元素时,先求hash值,再求索引,确定该元素在table的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加[原则和HashSet一样])