LRUCache 具体解释
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中链表的长度
**/
@Override
protected 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 具体解释的更多相关文章
- 安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...
- LruCache的缓存策略
一.Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加.获取和删除这三类操作.如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大 ...
- Android LruCache技术原理
概述 记得在很早之前,我有写过一篇文章Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技 ...
- LruCache DiskLruCache 缓存 简介 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 【转载】LruCache 源码解析
原文地址:https://github.com/LittleFriendsGroup/AndroidSdkSourceAnalysis/blob/master/article/LruCache%E6% ...
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...
- Android面试收集录10 LruCache原理解析
一.Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加.获取和删除这三类操作.如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大 ...
- 【转】彻底解析Android缓存机制——LruCache
彻底解析Android缓存机制——LruCache 关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存.这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻 ...
- 利用LruCache载入网络图片实现图片瀑布流效果(改进版)
PS: 2015年1月20日21:37:27 关于LoadImageAsyncTask和checkAllImageViewVisibility可能有点小bug 改动后的代码请參见升级版本号的代码 ht ...
随机推荐
- LeetCode(9)Palindrome Number
题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...
- ACM Changchun 2015 A. Too Rich
You are a rich person, and you think your wallet is too heavy and full now. So you want to give me s ...
- 【01】CSS规范
[01]CSS规范 []https://drafts.csswg.org/indexes/(下图) https://www.w3.org/TR/2011/REC-CSS2-20110607/ ...
- Java总结输入流输出流
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群:618528494 我们一起学Java! 1.什么是IO Java中I/O操作主要是指使用 ...
- Android Email check 正则表达式
Android Email check 正则表达式 (?:[-!#-\\'*+\\x2f-9=?A-Z^-~]+(?:\\.[-!#-\\'*+\\x2f-9=?A-Z^-~]+)*|\"( ...
- POJ——3984迷宫问题(BFS+回溯)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14568 Accepted: 8711 Description ...
- BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP
发现每一次死亡的几率相等,所以只需要判断最少问多少人即可. 并且环上的点任意询问都可以. 所以直接Tarjan缩点,然后计算入度为0的点的数目. 但是还有一些情况的时候会减少一次询问,比如说:$1-& ...
- Lucas定理详解
这篇博客是从另一位园友那里存的,但是当时忘了写原文的地址,如果有找到原文地址的请评论联系! Lucas定理解决的问题是组合数取模.数学上来说,就是求 \(\binom n m\mod p\).(p为素 ...
- C++ string 类中的 assign()函数
C++ string 类的成员函数,用于拷贝.赋值操作,它们允许我们顺次地把一个 string 对象的部分内容拷贝到另一个 string 对象上. 函数原型 string &operator= ...
- Spoj-DWARFLOG Manipulate Dwarfs
Manipulate Dwarfs In a small village beyond seven hills and seven seas, Snow White lives together wi ...