LinkedHashMap的特点与原理
一般来说HashMap的无序的,及内部的存储顺序和输出顺序不一定相同(除非输入key的hash值是有序的)。而LinkedHashMap则是有序的。LinkedHashMap同样支持null键和值,并且值可以重复,它也是不同步的。
它的有序性表现为两种:
1.遍历输出的顺序与put顺序一致
2.按访问顺序输出
按输入顺序遍历输出,这个好理解:
LinkedHashMap<Integer,String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put(1,"aa");
linkedHashMap.put(100,"bb");
linkedHashMap.put(2,"cc");
linkedHashMap.put(3,"dd");
Iterator iterator = linkedHashMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry entry = (Map.Entry) iterator.next();
System.out.println(entry.getKey()+"="+entry.getValue());
}
输出:
1=aa
100=bb
2=cc
3=dd
按照访问顺序输出,就是被访问的entry会被链表链接到尾部:
LinkedHashMap<Integer,String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true);
linkedHashMap.put(1,"aa");
linkedHashMap.put(100,"bb");
linkedHashMap.put(2,"cc");
linkedHashMap.put(3,"dd");
linkedHashMap.get(1);
Iterator iterator = linkedHashMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry entry = (Map.Entry) iterator.next();
System.out.println(entry.getKey()+"="+entry.getValue());
}
输出:
100=bb
2=cc
3=dd
1=aa
可以看到1=aa在被访问过后跑到了最后一个。
这里的LinkedHashMap有三个参数:
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder)
initialCapacity和loadFactor和hashmap里的一样,分别是初始化容量和装载因子(默认为0.75)。accessOrder为是否按照访问顺序排列,如果是,则被访问的entry将排列到最后一个,默认是false,即按照输入顺序排列。
LinkedHashMap继承了HashMap并实现了Map接口。所以它具有HashMap的所有特性。并且内部对数据的存储也是数组加链表的形式。但是它多了一个双向链表来维护内部数据的顺序关系。
Entry的定义
LikedHaashMap的Entry继承了HashMap的Entry,并且多了Entry<K,V> before, after;
,用于双链表的前驱后继节点。
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);
}
}
具体的操作就不看了,会用就好。
关于LinkedHashMap的几个问题
问 题 | 答 案 |
LinkedHashMap是否允许键值对为空 | Key和Value都允许空 |
LinkedHashMap是否允许重复数据 | Key重复会覆盖、Value允许重复 |
LinkedHashMap是否有序 | 有序 |
LinkedHashMap是否线程安全 | 非线程安全 |