1.概述 使用HashMap的时候会遇到需要按照当时put的顺序来进行哈希表的遍历。但是HashMap中不存在保存顺序的机制。 LinkedHashMap专为此特性而生。LinkedHashMap中可以保持两种顺序,分别是插入顺序和访问顺序。相对于访问顺序,按照插入顺序进行编排被使用到的场景更多一些,所以默认是按照插入顺序进行编排。 2.原理 ①LinkedHashMap通过双向链表的结构来维护节点的顺序的。每个节点都进行了双向的连接,维持插入的顺序。head指向第一个插入的节点,tail指向最后一个节点。 ②LinkedHashMap是HashMap的亲儿子,直接继承HashMap类。LinkedHashMap中的节点元素为Entry<K,V>,直接继承HashMap.Node<K,V>。 3.分析 3.1 节点构造方法 LinkedHashMap继承HashMap,在HashMap类的put方法中,新建节点是使用的newNode方法。而在LinkedHashMap没有重写父类的put方法,而是重写了newNode方法来构建自己的节点对象。 3.2 put方法 在LinkedHashMap类使用的仍然是父类HashMap的put方法,所以插入节点对象的流程基本一致。不同的是,LinkedHashMap重写了afterNodeInsertion和afterNodeAccess方法。 afterNodeInsertion方法用于移除链表中的最旧的节点对象,也就是链表头部的对象。实现的逻辑,是把入参的节点放置在链表的尾部。 3.3 get方法 LinkedHashMap中的get方法与父类HashMap处理逻辑相似,不同之处在于增加了一处链表更新的逻辑。如果LinkedHashMap中存在要寻找的节点,那么判断如果设置了accessOrder,则在返回值之前,将该节点移动到对应桶中链表的尾部。 3.4 remove方法 LinkedHashMap重写了afterNodeRemoval方法,用于在删除节点的时候,调整双链表的结构。 4.小结 LinkedHashMap相对于HashMap,增加了双链表的结果(即节点中增加了前后指针),其他处理逻辑与HashMap一致,同样也没有锁保护,多线程使用存在风险。

相关推荐

迷茫的大四🐶:💐孝子启动失败,改为启动咏鹅
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务