Java简易LRU缓存实现(开发技巧)

来源:互联网 发布:青岛网络电视台爱社区 编辑:程序博客网 时间:2024/05/17 01:11

Java简易LRU缓存实现(开发技巧)

 

威哥说:

缓存与APP应用的关系,好比西门庆与色,根本就离不开,而且地位最重,所以,小白们想成为老鸟,对待缓存之情必需要深入,以下文章给你介绍了Java如果实现LRU(Least Recently Used)算法,即最近最少使用算法,这个算法在Android开发中被用于图片,内容的缓存,我在《Android核心技术(下)》课程中就详细讲解了LRU的全部实现,有兴趣的朋友可以登录扣丁学堂学习。

 

 

背景

LinkedHashMap继承自HashMap,内部提供了一个removeEldestEntry方法,该方法正是实现LRU策略的关键所在,且HashMap内部专门为LinkedHashMap提供了3个专用回调方法,afterNodeAccess、afterNodeInsertion、afterNodeRemoval,这3个方法的字面意思非常容易理解,就是节点访问后、节点插入后、节点删除后分别执行的行为。基于以上行为LinkedHashMap就可以实现一个LRUCache的功能了。

 

 

关于LinkedHashMap的eldest:eldest字面意思为最老的,LinkedHashMap中有个叫做accessOrder的字段,当accessOrder为true时表示LinkedHashMap内部节点按照访问次数排序,最老的节点也就是访问最少的节点。当accessOrder为false时表示LinkedHashMap内部节点按照插入顺序排序,最老的节点也就是最早插入的节点,该值默认为false。

 

 

实现

自己实现LRUCache只需覆盖removeEldestEntry这个方法即可,代码如下

 

private static class LRUCache<K, V>extends LinkedHashMap<K, V>

    {

       private static final long serialVersionUID = -9111855653176630846L;

       private static int MAX_ELEMENTS;

       public LRUCache(int initCap, int maxSize) throwsIllegalArgumentException

       {

           super(initCap, 0.75f, true);

           if (maxSize < 0)

                throw newIllegalArgumentException();

           MAX_ELEMENTS = maxSize;

       }

       @Override

       protected boolean removeEldestEntry(Map.Entry<K, V> eldest)

       {

           return size() > MAX_ELEMENTS;

       }

    }

 

以上代码需要一个MAX_ELEMENTS变量限制最大存储节点个数,插入节点时判断 如果当前节点个数已经超过了这个值则会根据LRU策略将访问最少的那个节点删除,这里需要注意,默认LinkedHashMap保证的是插入顺序,也就是节点按照插入先后来排序的,所以就算删除也是删除最先插入的节点,但是我们在构造函数中传入了一个true,这个参数决定了LinkedHashMap内部的节点按照什么方式排序,参数为true时说明内部节点按照最近访问的时间排序,为false时说明按照插入顺序排序。至此已完成了一个简易的LRUCache实现。

 

 

注意

由于LinkedHahsMap本身实现不是线程安全的,也就是说这个LRUCache也不是线程安全的,如果想要能多线程访问的话,可以这样使用它:LRUCache cache =Collections.synchronizedMap(new LRUCache(10, 10))。这样cache就可以在多线程下执行get\put等操作了,但是,用这种方式得到的cache在多线程遍历时还是不安全的。所以不能在多线程下遍历cache,官方文档也建议在遍历synchronizedmap时使用map本身做同步。

想要学习更全更体统的软件开发教学视频就在扣丁学堂www.codingke.com,主要是全部免费,全部免费,全部免费哦!!!重要的事情说三遍,你还在等什么,臣妾就等着你来翻牌了!!!这是一家注册就能看的网站。

0 0
原创粉丝点击