1.简介
- LinkedHashSet 是 HashSet 的子类
- LinkedHashSet 底层是一个 LinkedHashMap(是HashMap的子类),底层维护了一个 数组+双向链表 每一个节点都有 before 和 after 属性
- LinkedHashSet 有head 和 tail
- LinkedHashSet 根据元素的 HashCode 值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。(存入顺序与取出相同)
- LinkedHashSet 不允许添加重复元素
2.LinkedHashSet 的table数组
数组的类型是 HashMap$Node,存放的元素的类型是 LinkedHashMap$Entry 多态的表现
- LinkedHashMap 中的静态内部类 Entry
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
- HashMap中的静态内部类 Node
//实现的是Map接口中的Entry接口
static class Node<K,V> implements Map.Entry<K,V>
3.添加机制
- 先求出hash值,找到对应table索引
- 然后将添加的元素加入到双向链表【如果已经存在,则不添加[和HashSet一样]】
- 注意维护双向链表
tail.next = new Element;//简单指定 newElement.prev = tail; tail = newElement;