【你问我答】LinkedHashMap是怎么实现的?

问题描述:

LinkedHashMap是怎么实现的?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!


#悬赏##面试题目#
全部评论
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一致,同样也没有锁保护,多线程使用存在风险。
1 回复
分享
发布于 2020-02-19 20:53
一个链表加一个hashmap,非常简单!
点赞 回复
分享
发布于 2020-02-18 13:33
联想
校招火热招聘中
官网直投
LinkedHashMap基本结构 1、LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。 2、LinkedHashMap的基本实现思想就是----多态。 代码定义: public class LinkedHashMap<K,V>     extends HashMap<K,V>     implements Map<K,V> {     ... }
点赞 回复
分享
发布于 2020-02-19 02:28

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务