成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

起飛,手擼了一個 LRU 緩存,源碼原來這么簡單!

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

LRU 介紹

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

簡單的說就是,對于一組數據,例如:int[] a = {1,2,3,4,5,6},如果1,2這幾個數字經常被使用,那么會排在3,4,5,6的后面,數組變成如下:int[] a = {3,4,5,6,1,2},如果一個數字,經常不被使用,就會排在最前面!

LRU 算法,一般用于熱點數據的查詢,比如新聞信息,越是能被用戶看得多的新聞,越有可能被別的用戶所看到,對于那種基本沒人訪問的新聞,基本都類似存入大海!

在 Java 中,就有這么一個集合類實現了這個功能,它就是LinkedHashMap!

LinkedHashMap 介紹

我們都知道,在java集合中,LinkedHashMap 繼承自 HashMap,底層是一個雙向鏈表的數據結構,與 HashMap 不同的是,LinkedHashMap 初始化階段有個參數accessOrder,默認是false。

public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>{
/**雙向鏈表的頭節點*/
transient LinkedHashMap.Entry<K,V> head;
/**雙向鏈表的尾節點*/
transient LinkedHashMap.Entry<K,V> tail;
/**
* 1、如果accessOrder為true的話,則會把訪問過的元素放在鏈表后面,放置順序是訪問的順序
* 2、如果accessOrder為false的話,則按插入順序來遍歷
*/
final boolean accessOrder;
}

如果傳入的是true,則會把最近訪問過的元素放在鏈表后面,放置順序是訪問的順序,測試如下:

public static void main(String[] args) {
//accessOrder默認為false
Map<String, String> accessOrderFalse = new LinkedHashMap<>();
accessOrderFalse.put("1","1");
accessOrderFalse.put("2","2");
accessOrderFalse.put("3","3");
accessOrderFalse.put("4","4");
System.out.println("acessOrderFalse:"+accessOrderFalse.toString());

//accessOrder設置為true
Map<String, String> accessOrderTrue = new LinkedHashMap<>(16, 0.75f, true);
accessOrderTrue.put("1","1");
accessOrderTrue.put("2","2");
accessOrderTrue.put("3","3");
accessOrderTrue.put("4","4");
accessOrderTrue.get("2");//獲取鍵2
accessOrderTrue.get("3");//獲取鍵3
System.out.println("accessOrderTrue:"+accessOrderTrue.toString());
}

輸出結果如下:

acessOrderFalse:{1=1, 2=2, 3=3, 4=4}
accessOrderTrue:{1=1, 4=4, 2=2, 3=3}

可以得知,當我們將accessOrder設置為true的時候,經常被訪問的元素會放入前面!

我們利用這個特性,使用 LinkedHashMap 來實現一個 LRU 緩存,操作如下:

  • 創建一個 LinkedHashMap 對象,將accessOrder設置為true;
  • 設定 LinkedHashMap 的容量為n,超過這個值就刪除多余的元素;
  • 重寫 LinkedHashMap 中removeEldestEntry()方法;

其中removeEldestEntry()表示,如果返回的是true,就會移除最近不被使用的元素,如果返回false,不做任何操作,這個方法每次在add()的時候就會調用。

創建一個 LRU 緩存類,內容如下:

public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {

//創建一個容量為3的LinkedHashMap
private static final int MAX_SIZE = 3;

/**
* 重寫LinkedHashMap中removeEldestEntry方法
* @param eldest
* @return
*/
protected boolean removeEldestEntry(Map.Entry eldest) {
//如果容器中的元素個數大于MAX_SIZE,在每次添加元素的時候,移除容器中最近不被使用的元素
return size() > MAX_SIZE;
}

public LRULinkedHashMap() {
//設置LinkedHashMap初始化容量,負載因子為0.75f,accessOrder設置為true
super(MAX_SIZE, 0.75f, true);
}
}

測試使用:

public static void main(String[] args) {
LRULinkedHashMap<String,String> cache = new LRULinkedHashMap<String,String>();
cache.put("1","a");
cache.put("2","b");
cache.put("3","c");
System.out.println("初始cache內容:" + cache.toString());
cache.get("2");
System.out.println("查詢key為2的元素之后,cache內容:" + cache.toString());
cache.put("4","d");
System.out.println("添加新的元素之后,cache內容:" + cache.toString());
}

輸出結果如下:

初始cache內容:{1=a, 2=b, 3=c}
查詢key為2的元素之后,cache內容:{1=a, 3=c, 2=b}
添加新的元素之后,cache內容:{3=c, 2=b, 4=d}

初始cache內容:{1=a, 2=b, 3=c}查詢key為2的元素之后,cache內容:{1=a, 3=c, 2=b}添加新的元素之后,cache內容:{3=c, 2=b, 4=d}

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2021-11-04 17:23:03

Java對象 immutable

2021-03-15 09:23:06

讀寫分離MySql數據庫

2021-04-19 05:42:51

Mmap文件系統

2022-06-01 07:49:43

索引數據Mysql

2021-05-14 13:30:17

Mybatis分表插件

2018-06-08 16:48:09

PythonQQ機器人

2023-11-01 14:49:07

2020-11-04 07:56:19

工具Linux 翻譯

2021-10-27 06:49:34

線程池Core函數

2021-10-04 09:29:41

對象池線程池

2022-03-01 11:38:51

RPC框架后端

2022-03-01 08:21:32

工具類代碼封裝網絡請求

2022-02-14 07:34:23

工具類GET、POST

2022-02-08 09:09:45

智能指針C++

2019-05-27 14:03:48

開發技能代碼

2023-09-22 08:00:00

分布式鎖Redis

2020-09-24 06:44:54

HTTPS網站 HTTP

2020-11-27 10:34:01

HTTPHTTPS模型

2014-10-08 15:00:50

SUSE操作系統云計算

2019-03-15 10:55:12

通信系統手機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美激情在线一区二区三区 | 日本午夜视频 | 亚洲国产精品99久久久久久久久 | 国产97在线 | 日韩 | 日韩一区在线播放 | 成年人黄色免费视频 | 操操日 | 国产一区二区三区在线 | 老司机午夜性大片 | 插插插干干干 | 免费黄色片在线观看 | 在线资源视频 | 在线视频国产一区 | 欧美成年网站 | 婷婷91| 亚洲天堂av在线 | 成人久久 | 日本成人在线观看网站 | 爽爽免费视频 | www.日韩免费 | 日本一区二区电影 | 97超碰成人| 青青草一区 | 久久精品中文字幕 | h在线播放 | 伊人av在线播放 | 国产精品久久久久久久久久免费看 | 亚洲精品不卡 | www国产成人免费观看视频 | 欧美三级电影在线播放 | 日韩欧美一级片 | 国产综合视频 | 国产精品五月天 | 色综合久久天天综合网 | 九九亚洲 | 91免费高清视频 | 中文字幕一区二区三区精彩视频 | 中文一区二区 | 九一视频在线观看 | 精品国产一区二区三区久久久蜜月 | 草草草久久久 |