php无版权企业网站管理系统,为离职员工做的网站,网站首页设计过程,大数据营销工具LinkedHashMap实现LRU缓存cache机制#xff0c;Kotlin LinkedHashMap的accessOrdertrue后#xff0c;访问LinkedHashMap里面存储的元素#xff0c;LinkedHashMap就会把该元素移动到最尾部。利用这一点#xff0c;可以设置一个缓存的上限值#xff0c;当存入的缓存数理超过…LinkedHashMap实现LRU缓存cache机制Kotlin LinkedHashMap的accessOrdertrue后访问LinkedHashMap里面存储的元素LinkedHashMap就会把该元素移动到最尾部。利用这一点可以设置一个缓存的上限值当存入的缓存数理超过上限值后删掉LinkedHashMap头部元素即可因为最头部意味着没有被多少使用。
至于删除最头部的元素我们自己可以写代码把最头部第一个元素找出来然后删掉。但是刚好LinkedHashMap内部源代码实现有一个函数 protected boolean removeEldestEntry(Map.EntryK,V eldest) {return false;}
它默认返回false如果该函数返回true那么LinkedHashMap就会去删除头部最老的值。在代码中动态判断当前存储的元素数理是否超过缓存上限超过就返回true让LinkedHashMap删除最头部最老的值。 import java.util.LinkedHashMapclass Lru(initialCapacity: Int,loadFactor: Float,accessOrder: Boolean
) : LinkedHashMapInt, String(initialCapacity, loadFactor, accessOrder) {private val CACHE_LIMIT: Int 3//accessOrdertrue改变LinkedHashMap的存储策略constructor() : this(10, 0.75F, true)//如果当前的map尺寸大于缓存上限//删除最老的元素。override fun removeEldestEntry(eldest: MutableMap.MutableEntryInt, String?): Boolean {return size CACHE_LIMIT}
}fun main(args: ArrayString) {val map Lru()map[1] Amap[2] Bmap[3] Cprintln(map)println(-)//插入D后最头的A被删除。println(插入D)map[4] Dprintln(map)println(-)//插入E后最头的B被删除。println(插入E)map[5] Eprintln(map)println(-)println(访问C)println(map[3])println(map)
}
特意设置最多缓存3个元素看代码运行结果 {1A, 2B, 3C} - 插入D {2B, 3C, 4D} - 插入E {3C, 4D, 5E} - 访问C C {4D, 5E, 3C} Java的HashMap与LinkedHashMap异同_zhangphil的博客-CSDN博客一句话概括的说两者最大的不同就是HashMap不保证put进去的数据的顺序而LinkedHashMap则保证put进去的数据的顺序。换句话也就是说HashMap添加进去的数据顺序和遍历时的数据顺序不一定而LinkedHashMap则保证添加时数据顺序是什么遍历时数据顺序是什么。例如假如在HashMap中依次、顺序添加元素12345在遍历HashMap时输出的顺https://blog.csdn.net/zhangphil/article/details/44115629
基于Java LinkedList,实现Android大数据缓存策略_zhangphil的博客-CSDN博客import java.util.HashMap;import java.util.LinkedList;/* * 基于Java LinkedList,实现Android大数据缓存策略 * 作者Zhang Phil * 原文出处http://blog.csdn.net/zhangphil * * 实现原理原理的模型认为在LinkedList的头部元素是最旧的缓存数据在L_android大数据缓存https://blog.csdn.net/zhangphil/article/details/44116885