LRUCache简单实现

来源于LeetCode. 146. LRU 缓存

题目要求实现一个LRUCache,我们使用get时,需要额外把该节点移动到开头;

我们使用put时,如果存在该节点,我们需要把该节点删除,并且插入到开头;不存在则插入到开头,此时需要判断长度是否大于给定的capacity。

并且实现这两种操作时,时间复杂度都必须为O(1);get我们使用HashMap便可以达到我们的时间复杂度,但是HashMap不是有序的,但它的子类LinkedHashMap是有序的,所以我们使用LinkedHashMap便可以达到本题的效果,但是我们还是自己实现一个双向链表,才能考验代码功底

class LRUCache {private DoubleLinkedList head;private DoubleLinkedList tail;private int capacity;private Map<Integer,DoubleLinkedList> cache;public LRUCache(int capacity) {cache=new HashMap<>();this.capacity=capacity;head=new DoubleLinkedList(0,0);tail=new DoubleLinkedList(0,0);head.next=tail;tail.pre=head;}public int get(int key) {if(cache.containsKey(key)){DoubleLinkedList temp=cache.get(key);//删除掉这个节点delete(temp);//在头结点插入这个节点insert(temp);return temp.val;}else{return -1;}}public void put(int key, int value) {if(cache.containsKey(key)){DoubleLinkedList temp=cache.get(key);delete(temp);insert(temp);temp.val=value;}else{DoubleLinkedList temp=new DoubleLinkedList(key,value);insert(temp);if(cache.size()>capacity){delete(tail.pre);}}}public void delete(DoubleLinkedList temp){cache.remove(temp.key);temp.next.pre=temp.pre;temp.pre.next=temp.next;}public void insert(DoubleLinkedList temp){cache.put(temp.key,temp);temp.next=head.next;temp.pre=head;head.next.pre=temp;head.next=temp;}class DoubleLinkedList{DoubleLinkedList pre;DoubleLinkedList next;int key;int val;public DoubleLinkedList(int key,int val){this.key=key;this.val=val;}}
}/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/

LRUCache简单实现相关推荐

  1. 缓存LruCache简单创建和使用

    LruCache一般使用: /*** 总容量为当前进程的1/8,单位:KB* sizeOf():计算缓存对象的大小,单位要一致* entryRemoved():移除旧缓存时调用*/int maxMem ...

  2. Android利用DiskLruCache和LruCache实现简单的照片墙

    现在很多App的某些功能会把图片以及内容缓存在本地,即使是没有网络的情况下也还是可以加载出之前浏览过的内容来,这些功能就是使用了DiskLruCache技术: LruCache负责管理内存中图片的存储 ...

  3. 内存缓存LruCache的简单使用

    LruCache算法(Least Recently Used),也叫近期最少使用算法. 这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并 ...

  4. linkedhashmap 顺序_有关于LinkedHashMap一份简单理解

    / 今日科技快讯 / 近日,台湾地区媒体<经济日报>转引<日经亚洲评论>报道称,自去年起,已有100多位原台积电工程师和经理人员被挖角到中国大陆,从事芯片研发制造项目.对此台积 ...

  5. Android LruCache 压缩图片 有效避免程序OOM

    压缩加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是 ...

  6. LruCache缓存处理及异步加载图片类的封装

    Android中的缓存处理及异步加载图片类的封装   一.缓存介绍: (一).Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一. 1.没有缓存的弊端 ...

  7. LruCache原理

    创建LruCache对象,重写其中的sizeOf方法: 然后看看LruCache内部长啥样子??? 看到A处,这里有个LinkedHashMap,这个是专门来存要缓存的对象,这个数据结构有个特点即链表 ...

  8. [置顶] 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<Strin ...

  9. LruCache缓存机制

    LruCache: Android提供的使用了(Least Recently Used)近期最少使用算法的缓存类 内部基于LinkedHashMap实现 实现这个主要需要重写 构造时需要确定Cache ...

最新文章

  1. 使用Configuration Manager管理移动设备
  2. android动态创建arraylist,Android:二维ArrayList帮助
  3. BZOJ3945 : 无聊的邮递员
  4. ios html双击下移,H5页面在ios上双击div,导致屏幕上移的js解决办法
  5. CTFshow 文件上传 web156
  6. jdk与jre的区别 很形象,很清晰,通俗易懂
  7. 常见操作系统调度算法研究(2)
  8. ios8 地图不能定位问题的解决办法
  9. php把视频剪辑成15秒一段,如何快速分割视频 一个视频或一个电影截取变成几份的功能 一段段截取 太累了...
  10. 普适计算机的应用领域有哪些,2017年度计算机科学各领域热点词汇
  11. vue项目中更新element-ui版本
  12. 32岁转行还来得及吗?
  13. 2020 年物联网设备达 500 亿台!AI、区块链技术加持,优秀开发者稀缺!
  14. cognos 样例 oracle,cognos10.2 sample(ORACLE学样例)
  15. DB and RAC(11.2.0.3 ) Patch Set Update(11.2.0.3.6 )
  16. shell编写一键安装mysql.sh
  17. 【BZOJ 2957】 2957: 楼房重建 (线段树)
  18. 分布式文件存储FastDFS之配置Nginx模块
  19. CUDA实例系列四:利用GPU加速Sobel边缘检测(含源码)
  20. 微信验证服务器地址有效性

热门文章

  1. epub解压的多个html制作单个html
  2. Unexpected exception parsing XML document from class path resource处理
  3. 视觉理解论文系列(一)——ERNIE-VIL
  4. python网格交易_网格交易(期货)
  5. 一个啥也不是的鬼畜视频创作示例
  6. Linux权限委派(生产环境必备)
  7. Shell 遍历数组的方法
  8. 全网首发 | Mac版 PS2022 终于来了,支持M1芯片,五大新黑科技
  9. Jmeter常用断言之响应断言详解
  10. linux usb检测工具,Linux下USB设备检测全教程