本文介绍: 所以LinkedHashMap也是一种kv键值对,并且内部是双链表的形式维护了插入顺序

LinkedHashMap 继承了 HashMap

所以LinkedHashMap也是一种kv键值对,并且内部是双链表的形式维护了插入顺序

LinkedHashMap如何保证顺序插入的?

在HashMap中时候说到过HashMap插入无序的

LinkedHashMap使用双向链表,内部的node节点包含了分别指向前驱和后驱的before和after两个指针

LinkedHashMap的特点有哪些

底层原理

插入元素

使用debug去put元素的时候会发现调用了HashMap的put方法,由于LinkedHashMap继承了HashMap,内部会调用put方法

但他们的实现逻辑不相同。不同点在于调用newNode(int hash, K key, V value, Node<K,V> e)方法不同,LinkedHashMap会调用自己内部的newNode方法

LinkedHashMap添加双向链表去维护节点节点之间的前后映射关系,添加了Node节点通过源码我们发现创建新节点的时候同步的也会创建before和after两个分别指向前驱节点和后驱节点的指针,这样保证了节点和节点之间相互之间能够非常明确


查找元素

通过get方法访问指定key,在debug断点调试过程发现代码没有执行第二个if判断里的逻辑,这是为什么呢?什么时候accessOrder会为true呢?accessOrder的作用是什么?

其实我们通过构造函数可以设置LinkedHashMap的访问顺序,其内部采用了LRU算法(最近最久未使用),每次被get元素会放在集合末尾,保证最近访问元素都在链表末尾。那怎么开启这项功能呢?

下图,在创建LinkedHashMap对象的时候可以定义设置初始容量、加载因子以及开启顺序访问,当对象初始化成功之后accessOrder就被置为true

上述中afterNodeAccess方法的作用是什么呢?是在访问节点后,将节点移动链表的尾部,此时在get元素之后我们输出集合发现顺序改变了。

删除元素和修改元素和LinkedList原理相同,修改指针的指向并且置删除位置null

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~

原文地址:https://blog.csdn.net/weixin_43319713/article/details/134722243

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_14091.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注