图解LinkedHashMap原理( 六 )

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

图解LinkedHashMap原理

文章插图
 
LinkedHashMap之Lru.png
5 总结
  1. LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的 。
  2. HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种 。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入) 。
  3. LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序 。
  4. LinkedHashMap是线程不安全的 。

【图解LinkedHashMap原理】


推荐阅读