深刻理解HashMap和LinkedHashMap的区别

深刻理解HashMap和LinkedHashMap的区别
咱们知道HashMap的变量顺序是不可预测的,这意味着便利的输出顺序并不必定和HashMap的插入顺序是一致的。这个特性一般会对咱们的工做形成必定的困扰。为了实现这个功能,咱们可使用LinkedHashMap。
LinkedHashMap详解
先看下LinkedHashMap的定义:
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
LinkedHashMap继承自HashMap,因此HashMap的全部功能在LinkedHashMap均可以用。
LinkedHashMap和HashMap的区别就是新建立了一个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);br/>}
}
这个Entry继承自HashMap.Node,多了一个before,after来实现Node之间的链接。
经过这个新建立的Entry,就能够保证遍历的顺序和插入的顺序一致。
下面看一个LinkedHashMap插入的例子:
@Test
public void insertOrder(){
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("ddd","desk");
map.put("aaa","ask");
map.put("ccc","check");
map.keySet().forEach(System.out::println);
}
输出结果:
ddd
aaa
ccc
能够看到输出结果和插入结果是一致的。
除了遍历的顺序,LinkedHashMap还有一个很是有特点的访问顺序。
咱们再看一个LinkedHashMap的构造函数:
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
前面的两个参数initialCapacity,loadFactor咱们以前已经讲过了,如今看最后一个参数accessOrder。
当accessOrder设置成为true的时候,就开启了 access-order。
access order的意思是,将对象安装最老访问到最新访问的顺序排序。咱们看个例子:br/>@Test
public void accessOrder(){
LinkedHashMap<String, String> map = new LinkedHashMap<>(16, .75f, true);
map.put("ddd","desk");
map.put("aaa","ask");
map.put("ccc","check");
map.keySet().forEach(System.out::println);
map.get("aaa");
map.keySet().forEach(System.out::println);
}
输出结果:
ddd
aaa
ccc
ddd
ccc
aaa
咱们看到,由于访问了一次“aaa“,从而致使遍历的时候排到了最后。
removeEldestEntry
最后咱们看一下LinkedHashMap的一个特别的功能removeEldestEntry。这个方法是干什么的呢?
经过从新removeEldestEntry方法,可让LinkedHashMap保存特定数目的Entry,一般用在LinkedHashMap用做缓存的状况。
removeEldestEntry将会删除最老的Entry,保留最新的。
ublic class CustLinkedHashMap<K, V> extends LinkedHashMap<K, V> {缓存

private static final int MAX_ENTRIES = 10;

public CustLinkedHashMap(
        int initialCapacity, float loadFactor, boolean accessOrder) {
    super(initialCapacity, loadFactor, accessOrder);
}

@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
    return size() > MAX_ENTRIES;
}

}
看上面的一个自定义的例子,上面的例子咱们建立了一个保留10个Entry节点的LinkedHashMap。
LinkedHashMap继承自HashMap,同时提供了两个很是有用的功能。ide

相关文章
相关标签/搜索