关于LRU缓存机制中 accessOrder不同排序模式的对比(含代码)

提示:我们在学习LinkedHashMap中的构造方法过程中,总是避不开accessOrder(排序模式)的分析,在学习过程中发现有不少网上的解释看着都晦涩难懂,有的很好理解,但是与实际自己操作结果不同,还有一些文章上的结果与自己操作的结果相同,但是实现的思路大相径庭,纠结于到底这个排序模式是个什么意思,自己专门去分析了一下,下面先放代码,看看到底是什么意思:


代码演示:

关于LRU缓存机制中 accessOrder不同排序模式的对比(含代码)
在true的情况下,我们知道put时,刚开始,是一个一个往双链表的头部插入(头插法),当达到容量的阈值数时,会去扩容,get时,如果有就把这个数放到头结点的后面,这样在上面的操作完成后
结构如下:
head<---->a<---->e<---->c<---->b<---->tail
输出时按照插入时的顺序放入则为bcea
同样的put和get,当排序模式改为false时,结果会是什么?abce?再看一张图
关于LRU缓存机制中 accessOrder不同排序模式的对比(含代码)
哎,你这说对了!
看来当排序模式为false时,我们的数据插入顺序就是我们读到的数据顺序,跟你get一个值都没关系。下面来多测试几个,话不多说,上图
关于LRU缓存机制中 accessOrder不同排序模式的对比(含代码)
是不是和想象中的一样,那么false的情况是啥样的,上图啦
关于LRU缓存机制中 accessOrder不同排序模式的对比(含代码)


原因分析:

好了,这里来总结一下,不知道大家看没看出问题所在,那就是你这个怎么理解这个双链表的插入方式,是头插法还是尾插法,头插法的实现就是上面的方式,好理解,注意,此时将头部的数据认为最近使用的,而尾部的数据是最久未使用的。但是头插法的理解不是Java API中的实现方式,Java API采用的是尾插法。注意,这时再理解这个问题,就变成了尾部的数据是最近使用的,而头部的数据是最久未使用的。
所以,原来我们争论的两种排序模式,只是我们在使用不同的数据结构和理解方式,本质上是同一个问题的两个理解方式。
再次归纳一下:
true:访问模式,即访问多次的数据放到链表最后面,再按照链表的插入方式输出(尾插法)
true:访问模式,即访问多次的数据放到链表最前面,再按照链表的插入方式输出,(头插法)
false:插入模式,无论怎样的访问,都会按照插入的顺序输出