最近在看mybatis的源代码,发现了mybatis中实现的LruCache使用到了LinkedHashMap,所以就探究了一下LinkedHashMap是如何支持Lru缓存的 LinkedHashMap内部维护了一个所有的Entity的双向链表 同时构造方法可以设置Iterator的时候,是按照插入的顺序排序还是按照访问的顺序排序 默认是按照插入的顺序来排序的,在构造方法里边可以设置按照访问的顺序来排序 那究竟按照访问的顺序来排序是什么意思呢? LinkedHashMap的get(key)方法…
1:通过反射,获取linkedHashMap的最后一个键值对. Map<Integer, Integer> map = new LinkedHashMap<>(); Field tail = map.getClass().getDeclaredField("tail"); tail.setAccessible(true); Map.Entry<Integer,Integer> entry=(Map.Entry<Integer, Integer&…
removeEldestEntry在使用put或者putAll方法插入一个新的entry到map中时被调用,是否要删除年老的entry取决于是否满足既定的条件(比如本例中的条件:MAP中entry数量大于1000).如果MAP表示缓存,这是有用的:它允许MAP通过删除过时条目来减少内存消耗. import java.util.LinkedHashMap; import java.util.Map; public class LruCache { private final Map<Object,…
这是一个来自实际项目的例子,在这个案例中,有同事基于jdk中的LinkedHashMap设计了一个LRUCache,为了提高性能,使用了 ReentrantReadWriteLock 读写锁:写锁对应put()方法,而读锁对应get()方法,期望通过读写锁来实现并发get(). 代码实现如下: private ReentrantReadWriteLock  lock = new ReentrantReadWriteLock (); lruMap = new LinkedHashMap<K, V>…
背景 LinkedHashMap继承自HashMap,内部提供了一个removeEldestEntry方法,该方法正是实现LRU策略的关键所在,且HashMap内部专门为LinkedHashMap提供了3个专用回调方法,afterNodeAccess.afterNodeInsertion.afterNodeRemoval,这3个方法的字面意思非常容易理解,就是节点访问后.节点插入后.节点删除后分别执行的行为.基于以上行为LinkedHashMap就可以实现一个LRUCache的功能了. 关于Li…
LRU 缓存介绍 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求助电话本,但是,通过电话本查找还是很费时间的.但是,我们大脑能够记住的东西是一定的,我们只能记住自己最熟悉的,而长时间不熟悉的自然就忘记了. 其实,计算机也用到了同样的一个概念,我们用缓存来存放以前读取的数据,而不是直接丢掉,这样,再次读取的时候,可以直接在缓存里面取,而不用再重新查找一遍,这样系统…
LruCache的Lru指的是LeastRecentlyUsed,也就是近期最少使用算法.也就是说,当我们进行缓存的时候,如果缓存满了,会先淘汰使用的最少的缓存对象. 为什么要用LruCache?其实使用它的原因有很多,例如我们要做一个电子商务App,如果我们不加节制的向服务器请求大量图片,那么对于服务器来说是一个不少的负担,其次,对于用户来说,每次刷新都意味着流量的大量消耗以及长时间等待,所以缓存机制几乎是每个需要联网的App必须做的. LruCache已经存在于官方的API中,所以无需添加任…
本文会从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,并在内存占用与加载图片所需时间这两个方面与主流图片加载框架之一Universal Image Loader做出比较,来帮助我们量化这个框架的性能.通过开发这个框架,我们可以进一步深入了解Android中的Bitmap操作.LruCache.LruDiskCache,让我们以后与Bitmap打交道能够更加得心应手.若对Bitmap的大小计算及inSampleSize计算还不太熟悉,请参考这里:高效加载Bit…
移动设备开发中,因为移动设备(手机等)的内存有限,所以使用有效的缓存技术是必要的.android提供来一个缓存工具类LruCache,开发中我们会经经常使用到,以下来他是怎样实现的. 在package android.util包里面有对LruCache定义的java文件.为了能准确的理解LruCache,我们先来看看原文的说明: * A cache that holds strong references to a limited number of values. Each time * a…
Java中的LinkedHashMap此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序). LinkedHashMap和TreeMap的区别 首先2个都是map,所以用key取值肯定是没区别的,区别在于用Iterator遍历的时候 LinkedHashMap保存了记录的插入顺序,先插入的先遍历到 TreeMap默认是按升序排,也可以指定排序的比较器.遍历的时候按升序遍历. http:…