码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • LinkedHashMap实现LRU缓存cache机制,Kotlin


    LinkedHashMap实现LRU缓存cache机制,Kotlin

     

    LinkedHashMap的accessOrder=true后,访问LinkedHashMap里面存储的元素,LinkedHashMap就会把该元素移动到最尾部。利用这一点,可以设置一个缓存的上限值,当存入的缓存数理超过上限值后,删掉LinkedHashMap头部元素即可(因为最头部意味着没有被多少使用)。

    至于删除最头部的元素,我们自己可以写代码,把最头部(第一个)元素找出来,然后删掉。但是,刚好,LinkedHashMap内部源代码实现有一个函数:

    1. protected boolean removeEldestEntry(Map.Entry eldest) {
    2. return false;
    3. }

    它默认返回false,如果该函数返回true,那么LinkedHashMap就会去删除头部最老的值。在代码中动态判断当前存储的元素数理是否超过缓存上限,超过就返回true,让LinkedHashMap删除最头部(最老的)值。

     

     

    1. import java.util.LinkedHashMap
    2. class Lru(
    3. initialCapacity: Int,
    4. loadFactor: Float,
    5. accessOrder: Boolean
    6. ) : LinkedHashMap<Int, String>(initialCapacity, loadFactor, accessOrder) {
    7. private val CACHE_LIMIT: Int = 3
    8. //accessOrder=true改变LinkedHashMap的存储策略
    9. constructor() : this(10, 0.75F, true)
    10. //如果当前的map尺寸大于缓存上限
    11. //删除最老的元素。
    12. override fun removeEldestEntry(eldest: MutableMap.MutableEntry<Int, String>?): Boolean {
    13. return size > CACHE_LIMIT
    14. }
    15. }
    16. fun main(args: Array<String>) {
    17. val map = Lru()
    18. map[1] = "A"
    19. map[2] = "B"
    20. map[3] = "C"
    21. println(map)
    22. println("-")
    23. //插入D后,最头的A被删除。
    24. println("插入D")
    25. map[4] = "D"
    26. println(map)
    27. println("-")
    28. //插入E后,最头的B被删除。
    29. println("插入E")
    30. map[5] = "E"
    31. println(map)
    32. println("-")
    33. println("访问C")
    34. println(map[3])
    35. println(map)
    36. }

    特意设置最多缓存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}

     

     

     

    Java的HashMap与LinkedHashMap异同_zhangphil的博客-CSDN博客一句话概括的说:两者最大的不同就是,HashMap不保证put进去的数据的顺序;而LinkedHashMap则保证put进去的数据的顺序。换句话也就是说,HashMap添加进去的数据顺序和遍历时的数据顺序不一定;而LinkedHashMap则保证添加时数据顺序是什么,遍历时数据顺序是什么。例如,假如在HashMap中依次、顺序添加元素:1,2,3,4,5,在遍历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

     

  • 相关阅读:
    数据库创建表,查询表,对表进行增删改查,以及分组使用进行查询,还有排序
    代码演示傅里叶合成演示
    Mysql开启binlog
    千峰商城-springboot项目搭建-81-订单提交及支付-qrcode生成二维码
    模型训练前后显卡占用对比、多卡训练GPU占用分析【一文读懂】
    bare Git 仓库是什么?
    08.SCA-CNN
    PHP 反序列化漏洞:手写序列化文本
    基于ElasticSearch存储海量AIS数据:AIS数据索引机制篇
    保护视力,从 CareUEyes 开始 —— 你的电脑护眼小助手
  • 原文地址:https://blog.csdn.net/zhangphil/article/details/132604797
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号