LRU Cache数据结构的介绍可以参考前面的http://www.cnblogs.com/XP-Lee/p/3441555.html

  本文以Android LRUCache来做一个简单的介绍。我们已经知道LRU Cache是一个hash map+双向链表的数据结构,那么在Android的Java自然也逃不出这个框,谷歌在Android3.1(v4 library也支持)之后提供了一个封装此数据结构实现的LRUCache类。

Android LRUCache访问数据

  LRUCache暴露了三个线程安全的方法get(K)、put(K)和remove(K),通过这三个方法,我们可以操作cache数据。get(K)或者put(K),它们始终都会将K对应的V移到链表头部,这样链表尾部就成为了最久没有使用的数据结点。remove(K)用来删除数据,通过调用entryRemoved(boolean evicted, K key, V oldValue, V newValue)达到进一步的数据清理。

  既然LRUCache是用来对缓存大小裁剪移除的,那以上描述除了remove(K)其它都没有涉及到关于缓存的大小检查啊,假设我不断的插入数据怎么办呢?下面接着缓存大小裁剪移除,做一个补充。在LRUCache中,我们无论调用get(K)还是put(K),它们都会调用方法trimToSize(int maxSize)进行缓存大小计算,当缓存大小超过maxSize时,就会调用entryRemoved(boolean evicted, K key, V oldValue, V newValue)清理数据。因此,使用LRUCache的get(K)或者put(K)访问数据时,其缓存大小将始终被维持在maxSize之下,当快要超过时链表尾部的数据会因为这套算法被删除清理。

重写方法

  Android LRUCache暴露三个方法可供重写。

  必须重写方法:

  • sizeOf(K, V):每个V的大小
  • entryRemoved(boolean evicted, K key, V oldValue, V newValue):回收缓存,只需要对newValue进行回收就可以

  看实际需求可重写也可不重写的方法:

  • creat(K):当map中没有K映射的V,该方法才会被get(K)方法调用。若creat(K)返回null,get(K)方法的调用点后续指令将直接以null的形式返回,不做任何处理;否则,就同以creat(K)的返回值作为K对应的V插入LRUCache。

隐藏方法

  Android LRUCache类还提供了一个权限为public的隐藏方法resize(int),该隐藏方法也是线程安全的,可以用来重置LRUCache的最大缓存。由于是隐藏方法,我们在代码中是无法显示的去调用,唯一可行的办法就是通过JAVA的反射机制去调用这个隐藏方法。

Android LRUCache简介的更多相关文章

  1. Android Framework 简介

    Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Androi ...

  2. Android Studio 简介及导入 jar 包和第三方开源库方[转]

    原文:http://blog.sina.com.cn/s/blog_693301190102v6au.html Android Studio 简介 几天前的晚上突然又想使用 Android Studi ...

  3. "浅谈Android"第一篇:Android系统简介

    近来,看了一本书,名字叫做<第一行代码>,是CSDN一名博主写的,一本Android入门级的书,比较适合新手.看了书之后,有感而发,想来进行Android开发已经有一年多了,但欠缺系统化的 ...

  4. 【译】Android系统简介—— Activity

    续上一篇,继续介绍Android系统.上一篇: [译]Android系统简介 本文主要介绍构建Android应用的一些主要概念: Activity Activity是应用程序中一个单独的有UI的页面( ...

  5. 被遗忘的Android mipmaps简介

    被遗忘的 Android mipmaps 简介 [导读]已经发布的 Android Studio1.1 版本是一个 bug 修复版本.在这个版本中,当你创建工程时一项改变将会吸引你的眼球.工程创建登陆 ...

  6. Android系统简介(中):系统架构

    Android的系统架构栈分为4层,从上往下分别是Applications.Application framework.Libraries  & Android Runtime.Linux  ...

  7. Android系统简介(上):历史渊源

    上个月,看到微信的一系列文章,讲到Linux的鼻祖-李纳斯的传记<Just for Fun>, 其人神乎其能, 其人生过程非常有趣,值得每个程序员细细品味. 而实际上,对我而已,虽然做软件 ...

  8. Android ART简介

    一.    Android ART简介 Android DEX/ODEX/OAT文件

  9. Android插件简介

    /** * @actor Steffen.D * @time 2015.02.06 * @blog http://www.cnblogs.com/steffen */ Android插件简介 Andr ...

随机推荐

  1. [转]用HttpSessionListener与HttpSessionBindingListener实现在线人数统计

    原文链接:http://www.cnblogs.com/shencheng/archive/2011/01/07/1930227.html 下午比较闲(其实今天都很闲),想了一下在线人数统计方面的实现 ...

  2. MFC 双缓存绘图

    在SDI应用程序中,当我们需要时刻动态刷新界面的时候,如果我们一直使用,UpdateAllView()那么就会出现屏幕不停闪烁.闪屏非常严重,特别是一直在动态刷新的时候.并且在闪屏的过程中 我们根本就 ...

  3. Luogu P3960 列队(动态开点线段树)

    P3960 列队 题意 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有\(n \times m ...

  4. mybatis深入理解(三)-----MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面.本文将讲述MyBatis的事务管理的实现机制.首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  5. LintCode_100 删除排序数组中的重复数字 ||

    题目 跟进“删除重复数字”: 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A=[1,1,2,2,3]. C++代码 int rem ...

  6. LintCode_514 Paint Fence

    题目 here is a fence with n posts, each post can be painted with one of the k colors.You have to paint ...

  7. 使用Jedis操作Redis-使用Java语言在客户端操作---String类型

    前提:需要引入Jedis的jar包. /** * 我的redis在Linux虚拟机Centos7中,192.168.222.129是我虚拟机的ip地址. */ private static Jedis ...

  8. java如何使用 tesseract 4.0.0-1.4.4

    提示: 建议直接使用tess4j,tess4j是对tesseract的封装,使用更简单 首先引入依赖 <!-- https://mvnrepository.com/artifact/org.by ...

  9. sqlserver 2008 R2 安装教程(心得记录)

    在这里简单的记录下自己安装sqlserver的过程吧(本人以前安装失败过,然后卸载了,就一直没用,现在由于工具原因,重新安装,过程相对第一次安装会复杂点) 1.首先,把以前安装的注册表的对应c盘的文件 ...

  10. 爬取简书图片(使用BeautifulSoup)

    import requests from bs4 import BeautifulSoup url_list = [] kv = {'User-Agent':'Mozilla/5.0'} r = re ...