从注释上就可以看出,该方法就是不断移除LinkedHashMap中双向链表表头的元素,直到当前缓存大小小于或等于最大可缓存的大小 。
由前面的重排序我们知道,对LinkedHashMap的put和get操作,都会让被操作的Entry移动到双向链表的表尾,而移除是从map.entrySet().iterator().next()开始的,也就是双向链表的表头的header的after开始的,这也就符合了LRU算法的需求 。
下图表示了LinkedHashMap中删除、添加、get/put已存在的Entry操作 。
红色表示初始状态
紫色表示缓存图片大小超过了最大可缓存大小时,才能够表头移除Entry1
蓝色表示对已存在的Entry3进行了get/put操作,把它移动到双向链表表尾
绿色表示新增一个Entry7,插入到双向链表的表尾(暂时不考虑在HashMap中的位置)

文章插图
LinkedHashMap之Lru.png
5 总结
- LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的 。
- HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种 。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入) 。
- LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序 。
- LinkedHashMap是线程不安全的 。
【图解LinkedHashMap原理】
推荐阅读
- 电热水龙头原理是什么
- MySql 三大知识点,索引、锁、事务,原理分析
- MySQL索引原理
- Google SEO 系列 - 搜索引擎原理
- 谷歌工具——关键字规划师的操作指南和工作原理
- js中几种实用的跨域方法原理详解
- 自动感应水龙头怎么样 自动感应水龙头工作原理
- FastThreadLocal 原理分析
- 魔方颜色对应图 魔方公式符号意思图解
- 扇贝怎么清洗内脏图解 扇贝怎么清洗内脏
