【Java集合】LinkedHashMap

来源:互联网 发布:男士双肩背包推荐 知乎 编辑:程序博客网 时间:2024/06/05 21:01

【Java集合】LinkedHashMap

LinkedHashMap的概述

LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
LinkedHashMap实现与HashMap的不同之处在于,它维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。
注意,此实现不是同步的。如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。

LinkedHashMap的实现

对于LinkedHashMap而言,它继承与HashMap、底层使用哈希表与双向链表来保存所有元素。其基本操作与父类HashMap相似,它通过重写父类相关的方法,来实现自己的链接列表特性。

LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了数组中保存的元素Entry,该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表。

LinkedHashMap.Entry的定义如下:

/** * HashMap.Node subclass for normal LinkedHashMap entries. */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);    }}

三个重点实现的函数

// Callbacks to allow LinkedHashMap post-actionsvoid afterNodeAccess(Node<K,V> p) { }void afterNodeInsertion(boolean evict) { }void afterNodeRemoval(Node<K,V> p) { }

LinkedHashMap继承于HashMap,因此也重新实现了这3个函数,顾名思义这三个函数的作用分别是:节点访问后、节点插入后、节点移除后做一些事情。

参考:
http://yikun.github.io/2015/04/02/Java-LinkedHashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/

http://zhangshixi.iteye.com/blog/673789