LRU的基本概念:

LRU是Least Recently Used的缩写,最近最少使用算法。

Java 实现LRUCache

1、基于LRU的基本概念,为了达到按最近最少使用排序。能够选择HashMap的子类
 LinkedHashMap来作为LRUCache的存储容器。
  2、LinkedHashMap的原理:
  a、 对于LinkedHashMap而言,它继承与HashMap、底层使用哈希表与双向链表来保存全部元素。其基本操作与父类HashMap相似,它通过重写父类相关的方法。来实现自己的链接列表特性。

HashMap是单链表。LinkedHashMap是双向链表
  b、存储:LinkedHashMap并未重写父类HashMap的put方法,而是重写了父类HashMap的put方法调用的子方法void recordAccess(HashMap m)   。void addEntry(int hash, K key, V value, int bucketIndex) 和void createEntry(int hash, K key, V value, int bucketIndex),提供了自己特有的双向链接列表的实现。
  c、读取:LinkedHashMap重写了父类HashMap的get方法,实际在调用父类getEntry()方法取得查找的元素后,再推断当排序模式accessOrder为true时。记录訪问顺序,将最新訪问的元素加入到双向链表的表头,并从原来的位置删除。因为的链表的添加、删除操作是常量级的,故并不会带来性能的损失。

LRUCache的简单实现

package com.knowledgeStudy.lrucache;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/*** 固定大小 的LRUCache<br>* 线程安全**/
public class LRUCache<K, V> {private static final float factor = 0.75f;//扩容因子private Map<K, V> map; //数据存储容器private int cacheSize;//缓存大小public LRUCache(int cacheSize) {this.cacheSize = cacheSize;int capacity = (int) Math.ceil(cacheSize / factor) + 1;map = new LinkedHashMap<K, V>(capacity, factor, true) {private static final long serialVersionUID = 1L;/*** 重写LinkedHashMap的removeEldestEntry()固定table中链表的长度**/@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {boolean todel = size() > LRUCache.this.cacheSize;return todel;}};}/*** 依据key获取value** @param key* @return value**/public synchronized V get(K key) {return map.get(key);}/*** put一个key-value** @param key*            value**/public synchronized void put(K key, V value) {map.put(key, value);}/*** 依据key来删除一个缓存** @param key**/public synchronized void remove(K key) {map.remove(key);}/*** 清空缓存**/public synchronized void clear() {map.clear();}/*** 已经使用缓存的大小**/public synchronized int cacheSize() {return map.size();}/*** 获取缓存中全部的键值对**/public synchronized Collection<Map.Entry<K, V>> getAll() {return new ArrayList<Map.Entry<K, V>>(map.entrySet());}
}

LRUCache 具体解释相关推荐

  1. java lrucache 使用_LRUCache 具体解释

    LRU的基本概念: LRU是Least Recently Used的缩写,最近最少使用算法. Java 实现LRUCache 1.基于LRU的基本概念,为了达到按最近最少使用排序.能够选择HashMa ...

  2. 剖析Picasso中的内存缓存机制——LruCache

    众所周知,Picasso是一个优秀的Android图片加载库.本篇并不讨论picasso的使用,而是来谈一谈picasso的缓存机制. 我们知道,目前主流的图片解决方案大部分都是三级缓存,即内存缓存. ...

  3. 安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)...

    在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价--流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...

  4. android lru进程队列,Android缓存机制——LruCache

    一.Android中的缓存策略 Android的缓存,主要的就是内存缓存和硬盘缓存. 不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的.当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓 ...

  5. Android LruCache技术原理

    概述 记得在很早之前,我有写过一篇文章Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技 ...

  6. Android LRUCache原理

    关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存.这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻底理解Android中的缓存机制. 一.Androi ...

  7. LruCache源码的理解

    LruCache源码的理解 使用场景 在Android手机上加载图片,一般会用到三级缓存策略 内存的缓存策略,一般会用到LruCache来解决 内存用于缓存遇到的问题 1. 手机给每个应用分配的内存空 ...

  8. Android新的网络请求框架volley源码解释及示例

    最近遇到一个问题:我想用HttpClient来访问网络,发现怎么都无法new出HttpClient的对象,这我就有点摸不着头脑了.记得我之前都是可以使用这个类的,怎么突然间就用不了了.因为不知情,一下 ...

  9. LRUCache 原理

    目录 0.相关文章: 1.源码分析: 2.为什么用LinkedHashMap 0.相关文章: LRUCache源码分析(自己的,很详细) Glide--LruCache源码分析(文章一:阅读量152, ...

最新文章

  1. C++ 枚举类型基本知识
  2. 如何复制代码到剪贴板?JS/FLASH...
  3. 一个低级错误引发Netty编码解码中文异常
  4. Android targetSdkVersion详解
  5. c++median search中位数搜索的实现算法(附完整源码)
  6. HarmonyOS之AI能力·文字图像超分
  7. sbt安装、配置、運行(scala sbt helloworld)
  8. 安卓拒绝服务漏洞分析及漏洞检测
  9. C语言学习:%d、2d、02d、.2d的区别
  10. linux中的信号3——alarm、pause函数
  11. OpenShift 4 - 通过 secret 访问受保护的镜像
  12. iOS利用Speech Kit实现语音识别
  13. maven 教程入门 maven 配置管理 编译java程序
  14. 金融科技助力智慧运营
  15. 卡方 python_用Python进行卡方分析
  16. 化龙小型汽车考场手动挡C1科目二考试技巧(全网唯一最详细教程)
  17. 【Java】通讯录管理系统小项目
  18. [收藏|转贴]货币金额大写转换库(C#)
  19. Ubuntu 下的nis认证
  20. ERP 系统的核心是什么?有什么作用?

热门文章

  1. python课程设计报告总结-上海python课程设计报告目的
  2. python入门有基础-Python入门必须知道的11个知识点
  3. 简明python教程txt-Python新手的数据批量处理教程(TXT文件)
  4. foxmail邮件加载失败重试_java retry(重试) spring retry, guava retrying 详解
  5. LeetCode Verify Preorder Serialization of a Binary Tree
  6. Projects(子查询、连接,分组,聚合)
  7. LA3942 Remember the Word(Trie+DP)
  8. stl的set,multiset, map, multimap, deque, list, stack, queue, priority_queue
  9. SpringBoot开发案例从0到1构建分布式秒杀系统
  10. Shell脚本——初识