LinkedHashMap實(shí)現(xiàn)LRU緩存cache機(jī)制,Kotlin
?
LinkedHashMap的accessOrder=true后,訪(fǎng)問(wèn)LinkedHashMap里面存儲(chǔ)的元素,LinkedHashMap就會(huì)把該元素移動(dòng)到最尾部。利用這一點(diǎn),可以設(shè)置一個(gè)緩存的上限值,當(dāng)存入的緩存數(shù)理超過(guò)上限值后,刪掉LinkedHashMap頭部元素即可(因?yàn)樽铑^部意味著沒(méi)有被多少使用)。
至于刪除最頭部的元素,我們自己可以寫(xiě)代碼,把最頭部(第一個(gè))元素找出來(lái),然后刪掉。但是,剛好,LinkedHashMap內(nèi)部源代碼實(shí)現(xiàn)有一個(gè)函數(shù):
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return false;
}
它默認(rèn)返回false,如果該函數(shù)返回true,那么LinkedHashMap就會(huì)去刪除頭部最老的值。在代碼中動(dòng)態(tài)判斷當(dāng)前存儲(chǔ)的元素?cái)?shù)理是否超過(guò)緩存上限,超過(guò)就返回true,讓LinkedHashMap刪除最頭部(最老的)值。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-700586.html
?
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的存儲(chǔ)策略
constructor() : this(10, 0.75F, true)
//如果當(dāng)前的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("訪(fǎng)問(wèn)C")
println(map[3])
println(map)
}
特意設(shè)置最多緩存3個(gè)元素,看代碼運(yùn)行結(jié)果:
{1=A, 2=B, 3=C}
-
插入D
{2=B, 3=C, 4=D}
-
插入E
{3=C, 4=D, 5=E}
-
訪(fǎng)問(wèn)C
C
{4=D, 5=E, 3=C}
?
?
?
Java的HashMap與LinkedHashMap異同_zhangphil的博客-CSDN博客??一句話(huà)概括的說(shuō):兩者最大的不同就是,HashMap不保證put進(jìn)去的數(shù)據(jù)的順序;而LinkedHashMap則保證put進(jìn)去的數(shù)據(jù)的順序。換句話(huà)也就是說(shuō),HashMap添加進(jìn)去的數(shù)據(jù)順序和遍歷時(shí)的數(shù)據(jù)順序不一定;而LinkedHashMap則保證添加時(shí)數(shù)據(jù)順序是什么,遍歷時(shí)數(shù)據(jù)順序是什么。例如,假如在HashMap中依次、順序添加元素:1,2,3,4,5,在遍歷HashMap時(shí)輸出的順https://blog.csdn.net/zhangphil/article/details/44115629
基于Java LinkedList,實(shí)現(xiàn)Android大數(shù)據(jù)緩存策略_zhangphil的博客-CSDN博客import java.util.HashMap;import java.util.LinkedList;/* * 基于Java LinkedList,實(shí)現(xiàn)Android大數(shù)據(jù)緩存策略 * 作者:Zhang Phil * 原文出處:http://blog.csdn.net/zhangphil * * 實(shí)現(xiàn)原理:原理的模型認(rèn)為:在LinkedList的頭部元素是最舊的緩存數(shù)據(jù),在L_android大數(shù)據(jù)緩存https://blog.csdn.net/zhangphil/article/details/44116885文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-700586.html
?
到了這里,關(guān)于LinkedHashMap實(shí)現(xiàn)LRU緩存cache機(jī)制,Kotlin的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!