最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)簡單LRU緩存機(jī)制的方法

 更新時(shí)間:2020年05月26日 16:16:05   作者:南擘汪  
這篇文章主要介紹了Java實(shí)現(xiàn)簡單LRU緩存機(jī)制的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、什么是 LRU 算法

就是一種緩存淘汰策略。

計(jì)算機(jī)的緩存容量有限,如果緩存滿了就要刪除一些內(nèi)容,給新內(nèi)容騰位置。但問題是,刪除哪些內(nèi)容呢?我們肯定希望刪掉哪些沒什么用的緩存,而把有用的數(shù)據(jù)繼續(xù)留在緩存里,方便之后繼續(xù)使用。

LRU是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰。

二、LRU的使用

LRUCache cache = new LRUCache( 2 /* 緩存容量 */ );
    cache.put(1, 1);
    cache.put(2, 2);
    cache.get(1);    // 返回 1
    cache.put(3, 3);  // 該操作會使得密鑰 2 作廢

第一步:創(chuàng)建一個(gè)長度為2的LRUCache

第二步:cache.put(1, 1);放入key=1,value=1的數(shù)據(jù)

第三步:cache.put(2,2);放入key = 2,value = 2的數(shù)據(jù)
(因?yàn)?剛使用,所有把2移動到前面)

第四步:cache.get(1);獲取key = 1的數(shù)據(jù)
(因?yàn)槲覀儎偸褂昧?,所以把1移動到前面)

第五步:cache.put(3,3);放入key = 3,value = 3的數(shù)據(jù)
(因?yàn)?剛放進(jìn),所以放前面,又因?yàn)槿萘恐挥?,需要移除原先的1個(gè)。只因key = 2是最近最少使用的(key = 1剛get()過),所以移除2。

三、LRU的實(shí)現(xiàn)機(jī)制

算法:

LRU 緩存機(jī)制可以通過哈希表輔以雙向鏈表實(shí)現(xiàn),我們用一個(gè)哈希表和一個(gè)雙向鏈表維護(hù)所有在緩存中的鍵值對。

1)雙向鏈表按照被使用的順序存儲了這些鍵值對,靠近頭部的鍵值對是最近使用的,而靠近尾部的鍵值對是最久未使用的。

2)哈希表即為普通的哈希映射(HashMap),通過緩存數(shù)據(jù)的鍵映射到其在雙向鏈表中的位置。

一、初始化:

二、cache.put(1,1):

三、cache.put(2,2):

四、cache.get(1):

五、cache.put(3,3):

四、代碼如下

import java.io.*;
import java.util.HashMap;

public class test {

  public static void main(String args[]) throws IOException {

    LRUCache cache = new LRUCache( 2 /* 緩存容量 */ );
    cache.put(1, 1);
    cache.put(2, 2);
    cache.get(1);    // 返回 1
    cache.put(3, 3);  // 該操作會使得密鑰 2 作廢
    cache.get(2);    // 返回 -1 (未找到)
    cache.put(4, 4);  // 該操作會使得密鑰 1 作廢
    cache.get(1);    // 返回 -1 (未找到)
    cache.get(3);    // 返回 3
    cache.get(4);    // 返回 4
  }
}

/**
 * 設(shè)計(jì)和實(shí)現(xiàn)一個(gè) LRU (最近最少使用) 緩存機(jī)制。它應(yīng)該支持以下操作: 獲取數(shù)據(jù) get 和 寫入數(shù)據(jù) put
 */
class LRUCache {

  private HashMap<Integer,LinkedNode> cache = new HashMap();//方便通過key快速定位結(jié)點(diǎn)
  private int size;
  private int capacity;
  private LinkedNode head,tail;
  class LinkedNode{
    int key;
    int value;
    LinkedNode pre;
    LinkedNode next;
  }
  public LRUCache(int capacity) {
    this.size = 0;
    this.capacity = capacity;
    head = new LinkedNode();
    tail = new LinkedNode();
    head.next = tail;
    tail.pre = head;
  }

  /**
   * 移除節(jié)點(diǎn)
   * @param node
   */
  private void removeNode(LinkedNode node) {
    LinkedNode preNode = node.pre;
    LinkedNode nextNode = node.next;
    preNode.next = nextNode;
    nextNode.pre = preNode;
  }

  /**
   * 添加節(jié)點(diǎn)到頭部
   * @param node
   */
  private void addNode(LinkedNode node) {
    node.pre = head;
    node.next = head.next;
    head.next.pre = node;
    head.next = node;
  }

  /**
   * 將節(jié)點(diǎn)移動到頭部
   * @param node
   */
  private void moveToHead(LinkedNode node) {
    removeNode(node);
    addNode(node);
  }

  /**
   * 獲取數(shù)據(jù)
   * @param key
   * @return
   */
  public int get(int key) {
    LinkedNode node = cache.get(key);
    if(node != null) {
      moveToHead(node);
    }else{
      return -1;
    }
    return node.value;
  }

  /**
   * 寫入數(shù)據(jù)
   * @param key
   * @param value
   */
  public void put(int key, int value) {
    LinkedNode node = cache.get(key);
    //存在
    if(node != null) {
      node.value = value;//可能更新數(shù)據(jù)
      moveToHead(node);
    }
    //不存在
    else{
      LinkedNode newNode = new LinkedNode();
      newNode.key = key;
      newNode.value = value;
      cache.put(key,newNode);//更新Map
      addNode(newNode);//添加結(jié)點(diǎn)到頭部
      size++;//更新結(jié)點(diǎn)數(shù)
      if(size > capacity) {//如果結(jié)點(diǎn)數(shù)超過容量大小
        LinkedNode tailPre = tail.pre;
        cache.remove(tailPre.key);//更新Map
        removeNode(tailPre);//刪除最后一個(gè)結(jié)點(diǎn)(尾結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn))
        size--;
      }
    }
  }
}

總結(jié):自己實(shí)現(xiàn)的簡單LRU總歸太簡單了,要是想完善或者實(shí)現(xiàn)更真實(shí)的LRU,不妨參考一下Redis中的LRU。(◔◡◔)

到此這篇關(guān)于Java實(shí)現(xiàn)簡單LRU緩存機(jī)制的方法的文章就介紹到這了,更多相關(guān)Java LRU緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)飛機(jī)小游戲

    Java實(shí)現(xiàn)飛機(jī)小游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)飛機(jī)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • rabbitmq結(jié)合spring實(shí)現(xiàn)消息隊(duì)列優(yōu)先級的方法

    rabbitmq結(jié)合spring實(shí)現(xiàn)消息隊(duì)列優(yōu)先級的方法

    本篇文章主要介紹了rabbitmq結(jié)合spring實(shí)現(xiàn)消息隊(duì)列優(yōu)先級的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java初學(xué)者之五子棋游戲?qū)崿F(xiàn)教程

    Java初學(xué)者之五子棋游戲?qū)崿F(xiàn)教程

    這篇文章主要為大家詳細(xì)介紹了Java初學(xué)者之五子棋游戲?qū)崿F(xiàn)教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • SpringBoot沒有主清單屬性的解決方法

    SpringBoot沒有主清單屬性的解決方法

    在本篇文章里小編給大家整理的是關(guān)于解決SpringBoot沒有主清單屬性知識點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-11-11
  • SpringBoot整合Freemarker的基本步驟

    SpringBoot整合Freemarker的基本步驟

    這篇文章主要介紹了SpringBoot整合Freemarker的基本步驟,添加依賴及添加相關(guān)配置的實(shí)例代碼詳解,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Java web Hibernate如何與數(shù)據(jù)庫鏈接

    Java web Hibernate如何與數(shù)據(jù)庫鏈接

    這篇文章主要介紹了Java web Hibernate如何與數(shù)據(jù)庫鏈接,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • lombok?找不到get/set方法的原因及分析

    lombok?找不到get/set方法的原因及分析

    這篇文章主要介紹了lombok?找不到get/set方法的原因及分析,具有很好的參考價(jià)值,希望對大家有所幫助。
    2022-06-06
  • Spring Batch輕量級批處理框架實(shí)戰(zhàn)

    Spring Batch輕量級批處理框架實(shí)戰(zhàn)

    本文主要介紹了Spring Batch輕量級批處理框架實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Spring容器初始化及問題解決方案

    Spring容器初始化及問題解決方案

    這篇文章主要介紹了Spring容器初始化及問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring Boot中配置定時(shí)任務(wù)、線程池與多線程池執(zhí)行的方法

    Spring Boot中配置定時(shí)任務(wù)、線程池與多線程池執(zhí)行的方法

    這篇文章主要給大家介紹了關(guān)于Spring Boot中配置定時(shí)任務(wù)、線程池與多線程池執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評論

大丰市| 轮台县| 右玉县| 舞钢市| 江陵县| 民权县| 福建省| 甘肃省| 平罗县| 黄陵县| 雅安市| 绥江县| 阿拉善盟| 辛集市| 四川省| 尖扎县| 滕州市| 咸丰县| 东乡族自治县| 东城区| 县级市| 宿迁市| 金寨县| 大同市| 黄冈市| 米泉市| 施秉县| 永丰县| 灵武市| 阿坝县| 铁岭市| 汉源县| 修水县| 涞水县| 隆化县| 五原县| 济源市| 大同县| 邵东县| 汨罗市| 丰原市|