特征
- LinkedHashSet是HashSet的子类
- 底层是一个LinkedHashMap,底层维护了一个数组+单向链表+双向链表
- LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是有序的
- LinkedHashSet不允许添加重复元素
底层机制
- LinkedHashSet添加元素顺序和取出元素顺序一致
- LinkedHashSet底层维护的是一个LinkedHashMap(是HashMap的子类)
- LinkedHashSet底层结构(数组table+双向链表)
- 添加第一次时,直接将数组扩容到16,存放的节点类型是LinkedHashMap$Entry
- 数组类型是HashMap
N
o
d
e
[
]
,
存
放
的
数
据
是
L
i
n
k
e
d
H
a
s
h
M
a
p
Node[],存放的数据是LinkedHashMap
Node[],存放的数据是LinkedHashMapEntry类型
- Entry继承了Node的属性,并增加了before和after两个属性,以形成双向链表
- LinkedHashMap增加了头尾节点(head和tail)
package aggregate.setClass;
import java.util.Objects;
import java.util.Set;
import java.util.LinkedHashSet;
public class LinkedHashSetSource {
public static void main(String[] args) {
LinkedHashSet set = new LinkedHashSet();
set.add(123);
set.add(123);
set.add(new Customer("tom",1001));
set.add(445);
set.add("lsp");
set.add(new Customer("jack",1001));
}
}
class Customer{
private String name;
private int no;
public Customer(String name, int no) {
this.name = name;
this.no = no;
}
@Override
public int hashCode() {
return 100;
}
}
···