之前有看到过关于LruCache的面试题,今天趁空闲时间看一下LruCache原理,里面巧用了LinkedHashMap。
参考了两篇文章:
https://juejin.im/post/5a4b433b6fb9a0451705916f
https://www.jianshu.com/p/b49a111147ee
第一个是基于LinkedHashMap讲的,第二个是基于LruCache讲的。
但核心还是LinkedHashmap。
LinkedHashMap继承HashMap,只不过在自己内部维持了一个双向链表。每一个节点都有before和after指针。
LrcCache是 least recurrent used 缩写 意指最少 最近 使用的。
LinkedHashMap 结合自身的特点会在get时重新排序,当然这个排序是基于put。会把get的元素从原始位置移除,再拼接之前和之后的元素,这个是双向链表能够做到的,把get的元素放到双向链表末尾。
LrcCache借助它的这一特点,当put时超过缓存所设定的值那么就从头部删除元素,而尾部是最动态最常用的元素。LinkedHashMap刚好能够满足LrcCache这一特点。