• 算法-手写LRU


    方法一:通过LinkedHashMap

    1. package mycode.leetcode;
    2. import java.util.LinkedHashMap;
    3. import java.util.Map;
    4. /**
    5. * @author 苗晓强
    6. * @date 2023/9/24 13:27
    7. */
    8. public class MyLRUCache extends LinkedHashMap {
    9. private int capacity;
    10. public MyLRUCache(int capacity) {
    11. /**
    12. * 注意第三个参数的值
    13. * true 按照访问的顺序展示集合元素
    14. * false 按照插入的顺序访问元素
    15. */
    16. super(capacity, 0.75F,true);
    17. this.capacity = capacity;
    18. }
    19. @Override
    20. protected boolean removeEldestEntry(Map.Entry eldest) {
    21. return super.size() > capacity;
    22. }
    23. public static void main(String[] args) {
    24. MyLRUCache myLRUCache = new MyLRUCache(3);
    25. myLRUCache.put(1,"a");
    26. myLRUCache.put(2,"b");
    27. myLRUCache.put(3,"c");
    28. System.out.println(myLRUCache.keySet());
    29. myLRUCache.put(4,"d");
    30. System.out.println(myLRUCache.keySet());
    31. myLRUCache.put(3,"c");
    32. myLRUCache.put(3,"c");
    33. myLRUCache.put(3,"c");
    34. System.out.println(myLRUCache.keySet());
    35. myLRUCache.put(5,"e");
    36. System.out.println(myLRUCache.keySet());
    37. }
    38. }

    方法二:通过创建节点和双向链表

    1. package mycode.leetcode;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. /**
    5. * @author 苗晓强
    6. * @date 2023/9/24 13:43
    7. */
    8. public class MyLRUCacheNoJDK {
    9. //内部类Node 作为数据载体
    10. class Node{
    11. K key;
    12. V value;
    13. Node pre;
    14. Node next;
    15. public Node() {
    16. this.pre = this.next = null;
    17. }
    18. public Node(K key, V value) {
    19. this.key = key;
    20. this.value = value;
    21. this.pre = this.next = null;
    22. }
    23. }
    24. //双向队列,存放Node
    25. class DoubleLinkedList{
    26. Node head;
    27. Node tail;
    28. //构造方法,创建一个头尾节点相连的链表
    29. public DoubleLinkedList() {
    30. head = new Node<>();
    31. tail = new Node<>();
    32. head.next = tail;
    33. tail.pre = head;
    34. }
    35. //添加节点到头节点
    36. public void addHead(Node node){
    37. node.next = head.next;
    38. node.pre = head;
    39. head.next.pre = node;
    40. head.next = node;
    41. }
    42. //删除节点
    43. public void removeNode(Node node){
    44. node.pre.next = node.next;
    45. node.next.pre = node.pre;
    46. node.pre = null;
    47. node.next = null;
    48. }
    49. //获取最后一个节点
    50. public Node getLast(){
    51. return tail.pre;
    52. }
    53. }
    54. private int cacheSize;
    55. Map> map;
    56. DoubleLinkedList doubleLinkedList;
    57. public MyLRUCacheNoJDK(int cacheSize){
    58. this.cacheSize = cacheSize;
    59. map = new HashMap<>();
    60. doubleLinkedList = new DoubleLinkedList<>();
    61. }
    62. public int getKey(int key){
    63. if (!map.containsKey(key)){
    64. return -1;
    65. }
    66. Node node = map.get(key);
    67. doubleLinkedList.removeNode(node);
    68. doubleLinkedList.addHead(node);
    69. return node.value;
    70. }
    71. public void put(int key,int value){
    72. if (map.containsKey(key)){
    73. Node node = map.get(key);
    74. node.value = value;
    75. map.put(key,node);
    76. doubleLinkedList.removeNode(node);
    77. doubleLinkedList.addHead(node);
    78. } else {
    79. if (map.size() == cacheSize){
    80. Node lastNode = doubleLinkedList.getLast();
    81. map.remove(lastNode.key);
    82. doubleLinkedList.removeNode(lastNode);
    83. }
    84. Node newNode = new Node<>(key, value);
    85. map.put(key,newNode);
    86. doubleLinkedList.addHead(newNode);
    87. }
    88. }
    89. public static void main(String[] args) {
    90. MyLRUCacheNoJDK myLRUCache = new MyLRUCacheNoJDK(3);
    91. myLRUCache.put(1,1);
    92. myLRUCache.put(2,2);
    93. myLRUCache.put(3,3);
    94. System.out.println(myLRUCache.map.keySet());
    95. myLRUCache.put(4,1);
    96. System.out.println(myLRUCache.map.keySet());
    97. myLRUCache.put(3,1);
    98. myLRUCache.put(3,1);
    99. myLRUCache.put(3,1);
    100. System.out.println(myLRUCache.map.keySet());
    101. myLRUCache.put(5,1);
    102. System.out.println(myLRUCache.map.keySet());
    103. }
    104. }

  • 相关阅读:
    C语言19弹--交换数组元素
    【JavaSE】异常处理
    土耳其商务团一行莅临优积科技考察交流
    Pytorch利用图像分割识别手势验证码(Deeplabv3)
    探索Java设计模式:中介者模式
    数据治理-数据安全-基本概念
    我是怎么定位线上问题的?
    C#上位机系列(3)—定时器和串口的介绍
    一文说透 MySQL JSON 数据类型(收藏)
    CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)1
  • 原文地址:https://blog.csdn.net/mnimxq/article/details/133242415