Java集合-LinkedHashMap
# Java集合-LinkedHashMap
LinkedHashMap
通过维护一个保存所有条目(Entry)的双向链表,保证了元素迭代的顺序(即插入顺序)。具有以下特点:
- key和value都允许null
- key重复会覆盖,value 允许重复
- 按照元素插入顺序存储
- 非线程安全
# LinkedHashMap要点
LinkedHashMap
通过维护一对LinkedHashMap.Entry<K,V>
类型的头尾指针,以双链表形式,保存所有数据。
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V> {
// 双链表的头指针
transient LinkedHashMap.Entry<K,V> head;
// 双链表的尾指针
transient LinkedHashMap.Entry<K,V> tail;
// 迭代排序方法:true 表示访问顺序;false 表示插入顺序
final boolean accessOrder;
}
由于是链表的形式,所以数据结构是有序的。
# 构造方法
由于LinkedHashMap
是继承的HashMap
,他都构造方法都是使用的父类的构造方法。
public LinkedHashMap(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
accessOrder = false;
}
public LinkedHashMap(int initialCapacity) {
super(initialCapacity);
accessOrder = false;
}
public LinkedHashMap() {
super();
accessOrder = false;
}
public LinkedHashMap(Map<? extends K, ? extends V> m) {
super();
accessOrder = false;
putMapEntries(m, false);
}
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
# get方法
LinkedHashMap
的get
方法和HashMap
的get
方式类似,都会去调用getNode
方法。
public V get(Object key) {
Node<K,V> e;
if ((e = getNode(hash(key), key)) == null)
return null;
if (accessOrder)
afterNodeAccess(e);
return e.value;
}
# newNode方法
该方法类似于在链表最后节点处添加新节点。
Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
LinkedHashMap.Entry<K,V> p =
new LinkedHashMap.Entry<K,V>(hash, key, value, e);
linkNodeLast(p);
return p;
}
private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
LinkedHashMap.Entry<K,V> last = tail;
tail = p;
if (last == null)
head = p;
else {
// 双向
p.before = last;
last.after = p;
}
}
# containsValue
通过遍历LinkedHashMap.Entry<K,V>
,查找双向链表中是否存在指定值。
public boolean containsValue(Object value) {
for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after) {
V v = e.value;
if (v == value || (value != null && value.equals(v)))
return true;
}
return false;
}
# 参考
上次更新: 2024/06/29, 15:13:44