LinkedHashMap
一.继承关系
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
{
继承HashMap的父类,即拥有父类特征,实现Map接口,拥有map接口中的方法实现
二.属性
Entry<K,V> header; //定义可一个entry类型的header属性
boolean accessOrder; //有序性标志: false:插入有序 true:访问有序
Entry<K,V> extends HashMap.Entry<K,V> { //继承HashMap的entry实体
属性有6个
entry {
final K key;
V value;
Entry<K,V> next;
int hash;
Entry<K,V> before;
Entry<K,V> after;
}
三.put添加元素过程
1.首先他的父类HashMap实现put方法:
2.调用他父类的addEntry方法;
父类实现addEntry:
子类 LinkedHashMap实现addEntry:
3.通过源码解读,其元素添加和HashMap的实现是一致的,不同的处理是在数据顺序性处理上
LinkedHashMap的head节点初始化:
header = new Entry<>(-1, null, null, null);
header.before = header.after = header;
在处理过程中,始终获取header节点,
header节点的before节点的after指向当前节点
header节点的before指向当前节点 。如图:
四.其他注意点:
AccessOrder作用方法:插入有序/访问有序的处理
get() 获取元素的方法中有使用
AccessOrder=true时做处理
注意:仅处理before、after的指向流程
对原HashMap的数据+链表的关系没有改变;即数据hash索引位无影响,链表位置无影响
五.方法的使用
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkHashMapGY2 {
public static void main(String[] args) {
LinkedHashMap<Integer,String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(1,"15");
linkedHashMap.put(2,"15");
linkedHashMap.put(3,"15");
Iterator <Map.Entry<Integer,String>> iterator = linkedHashMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Integer,String> next1 = iterator.next();
Integer key = next1.getKey();
String value = next1.getValue();
System.out.println(key+" = "+value);
}
LinkedHashMap<Integer,Integer> link = new LinkedHashMap<Integer,Integer>(16,0.75f,true);
link.put(1, 1);
link.put(7, 5);
link.put(3, 4);
link.put(5, 7);
link.put(2, 6);
link.put(9, 0);
System.out.println(link);
link.get(3);
link.get(2);
System.out.println("访问后");
System.out.println(link);
}
}
输出结果:
C:\java\java7\jdk1.7.0_80\bin\java.exe -javaagent:D:\ideaIU-2018.1.5.win\lib\idea_rt.jar=17051:D:\ideaIU-2018.1.5.win\bin
1 = 15
2 = 15
3 = 15
{1=1, 7=5, 3=4, 5=7, 2=6, 9=0}
访问后
{1=1, 7=5, 5=7, 9=0, 3=4, 2=6}
Process finished with exit code 0