LinkdHashMap
1、LinkdHashMap简介
在工作中,我们经常使用的存储k-v的工具为HashMap,但是HashMap遍历时的顺序是无序的,但是由于某些特殊的原因,我们想要打印出的顺序是有序的,此时最好的解决方案也就是我们的这次的主角“LinkdHashMap”
2、LinkdHashMap实现原理
继承HashMap中的所有方法,只在Node内部类中,维护一个双向链表,以达到遍历时直接打印双向链表即可,但其他方法比如,get,put等等方法还是用HashMap中的方法
//重写了Node内部类,增加了一个双向链表
public static class Entry<K,V> extends HashMap.Node<K,V> {
//LinkdHashMap中的核心 双向链表
Entry<K,V> before, after;
//实现HashMap中的node赋值
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
//创建Node时,维护双向链表
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是为了维护双向链表
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;
}
}