LinkedHashMap实现LRU缓存cache机制,Kotlin
LinkedHashMap的accessOrder=true后,访问LinkedHashMap里面存储的元素,LinkedHashMap就会把该元素移动到最尾部。利用这一点,可以设置一个缓存的上限值,当存入的缓存数理超过上限值后,删掉LinkedHashMap头部元素即可(因为最头部意味着没有被多少使用)。
至于删除最头部的元素,我们自己可以写代码,把最头部(第一个)元素找出来,然后删掉。但是,刚好,LinkedHashMap内部源代码实现有一个函数:
Kotlin
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return false;
}
它默认返回false,如果该函数返回true,那么LinkedHashMap就会去删除头部最老的值。在代码中动态判断当前存储的元素数理是否超过缓存上限,超过就返回true,让LinkedHashMap删除最头部(最老的)值。
Kotlin
import java.util.LinkedHashMap
class Lru(
initialCapacity: Int,
loadFactor: Float,
accessOrder: Boolean
) : LinkedHashMap<Int, String>(initialCapacity, loadFactor, accessOrder) {
private val CACHE_LIMIT: Int = 3
//accessOrder=true改变LinkedHashMap的存储策略
constructor() : this(10, 0.75F, true)
//如果当前的map尺寸大于缓存上限
//删除最老的元素。
override fun removeEldestEntry(eldest: MutableMap.MutableEntry<Int, String>?): Boolean {
return size > CACHE_LIMIT
}
}
fun main(args: Array<String>) {
val map = Lru()
map[1] = "A"
map[2] = "B"
map[3] = "C"
println(map)
println("-")
//插入D后,最头的A被删除。
println("插入D")
map[4] = "D"
println(map)
println("-")
//插入E后,最头的B被删除。
println("插入E")
map[5] = "E"
println(map)
println("-")
println("访问C")
println(map[3])
println(map)
}
特意设置最多缓存3个元素,看代码运行结果:
{1=A, 2=B, 3=C}
插入D
{2=B, 3=C, 4=D}
插入E
{3=C, 4=D, 5=E}
访问C
C
{4=D, 5=E, 3=C}