1. package lru;
  2.  
  3. import java.util.HashMap;
  4.  
  5. public class LRUCache2<K,V> {
  6. public final int capacity;
  7. class DNode{
  8. K key;
  9. V value;
  10. DNode next;
  11. DNode pre;
  12. public DNode(K key, V value, LRUCache2<K, V>.DNode pre, LRUCache2<K, V>.DNode next) {
  13. super();
  14. this.key = key;
  15. this.value = value;
  16. this.pre = pre;
  17. this.next = next;
  18. }
  19.  
  20. }

  21.   //附加头结点
  22. DNode head=new DNode(null,null,null,null);
  23. DNode last=head;
  24.  
  25. HashMap<K,DNode> map=new HashMap<>();
  26.  
  27. public LRUCache2(int capacity) {
  28. this.capacity=capacity;
  29. }
  30.  
  31. public V get(K key) {
  32. DNode node=map.get(key);
  33. if(node!=null) {
  34. moveToHead(node);
  35. }
  36. return node==null?null:node.value;
  37. }
  38.  
  39. public void put(K key, V value) {
  40. DNode node=map.get(key);
  41. if(node==null) {
  42. if(map.size()>=capacity) {
  43. removeLast();
  44. }
  45. node=new DNode(key, value,head,head.next);
  46. if(head.next!=null)
  47. head.next.pre=node;
  48. head.next=node;
  49. map.put(node.key, node);
  50. if(last==head) last=node;
  51. }else {
  52. node.value=value;
  53. moveToHead(node);
  54. }
  55.  
  56. }
  57. private void removeLast() {
  58. // TODO Auto-generated method stub
  59. if(last==null) {
  60. throw new IllegalArgumentException("cant remove before put");
  61. }
  62. map.remove(last.key);
  63. last.pre.next=null;
  64. last=last.pre;
  65. }
  66.  
  67. private void moveToHead(LRUCache2<K, V>.DNode node) {
  68. // TODO Auto-generated method stub
  69. if(head.next==node) return;
  70. if(last==node) {
  71. last=node.pre;
  72. }
  73. node.pre.next=node.next;
  74. if(node.next!=null) node.next.pre=node.pre;
  75. node.next=head.next;
  76. node.pre=head;
  77. head.next.pre=node;
  78. head.next=node;
  79. }
  80. }

java基于Hash表和双向链表简单实现LRU Cache的更多相关文章

  1. 为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash&(h-1)=hash%h)位运算公式等价于取余运算?

    1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...

  2. 简单的LRU Cache设计与实现

    要求: 设计并实现一个LRU缓存的数据结构,支持get和set操作 get(key):若缓存中存在key,返回对应的value,否则返回-1 set(key,value):若缓存中存在key,替换其v ...

  3. 【线性表基础】基于线性表的简单算法【Java版】

    本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeR ...

  4. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

  5. Java断点续传(基于socket与RandomAccessFile的简单实现)

    Java断点续传(基于socket与RandomAccessFile的简单实现) 这是一个简单的C/S架构,基本实现思路是将服务器注册至某个空闲端口用来监视并处理每个客户端的传输请求. 客户端先获得用 ...

  6. java数据结构之hash表

    转自:http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html Hash表也称散列表,也有直接译作哈希表,Hash表是一种特 ...

  7. 简单好用的hash表-----uthash

    在软件开发中,不可不免的会使用到hash表,hash表的优点这里就不说了,以下介绍一个hash表的C实现, uthash是用宏实现的,使用的时候非常方便,只用包含uthash.h即可. Uthash的 ...

  8. PHP数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]

    catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...

  9. 哈希表(散列表)—Hash表解决地址冲突 C语言实现

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...

随机推荐

  1. Runtime常见使用

    一些语法 更改对象的类/获取对象的类 1234 CustomClass *class1 = [[CustomClass alloc]init];Class aclass =object_setClas ...

  2. JAVA补0--->String.format()的使用

    详细地址:http://blog.csdn.net/lonely_fireworks/article/details/7962171/ 标    志 说    明 示    例 结    果 + 为正 ...

  3. MyBatis 判断条件为等于的时候,常量需要加 .toString()

    当MyBatis 判断条件为等于的时候,常量需要加 .toString() 来转换,这种方法是稳定的,推荐使用,比如: <!-- 正确的,稳定,推荐使用 --> <if test=& ...

  4. rpmbuild 实践

    安装 rpmbuild 1 # yum install -y rpm-build 查看 rpmbuild 相关的宏和参数 12345678 # rpmbuild --showrc | grep --c ...

  5. 一步到位datatabls中文化

    #一步到位datatabls中文化 加入以下代码 $(document).ready(function () { $('#declarationList').DataTable({ destroy:t ...

  6. kali linux下运行.sh文件权限不够解决办法

    我要装一个生成免杀的神奇,系统提示权限不够 2 于是我想到了sudo,可还是不行 3 于是找到了方法 chmod   a+x   文件名 4 再运行一下,成功 5 有时有的方法很简答,只要你愿意找.

  7. 简单说 用CSS做一个魔方旋转的效果

    说明 魔方大家应该是不会陌生的,这次我们来一起用CSS实现一个魔方旋转的特效,先来看看效果图! 解释 我们要做这样的效果,重点在于怎么把6张图片,摆放成魔方的样子,而把它们摆放成魔方的样子,重点在于用 ...

  8. Windows安装python包出现PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问的问题解决方案

    在python中安装sqlalchemy时,总是提示(当安装依赖有vs的python包时,可能会出现以下错误:) PermissionError: [WinError 32] 另一个程序正在使用此文件 ...

  9. Nuxt简单使用Google/Baidu Analyze

    博客地址: https://www.seyana.life/post/17 具体账号注册方法和绑定方法可以去到官网下,都有相应的指南, 一般设置也比较简单,只需要把对应js代码添加到head中即可, ...

  10. MySQL的万字总结(缓存,索引,Explain,事务,redo日志等)

    hello,小伙伴们,好久不见,MySQL系列停更了差不多两个月了,也有小伙伴问我为啥不更了呢?其实我去看了MySQL的全集,准备憋个大招,更新篇长文(我不会告诉你是因为我懒的). 好了,话不多说,直 ...