偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java 自定義實(shí)現(xiàn) LRU 緩存算法

開發(fā) 后端 算法
LinkedHashMap繼承自HashMap,內(nèi)部提供了一個(gè)removeEldestEntry方法,該方法正是實(shí)現(xiàn)LRU策略的關(guān)鍵所在, 且HashMap內(nèi)部專門為L(zhǎng)inkedHashMap提供了3個(gè)專用回調(diào)方法,afterNodeAccess、 afterNodeInsertion、afterNodeRemoval,這3個(gè)方法的字面意思非常容易理解,就是節(jié)點(diǎn)訪問(wèn)后、節(jié)點(diǎn)插入后、節(jié)點(diǎn)刪除后 分別執(zhí)行的行為。

背景

LinkedHashMap繼承自HashMap,內(nèi)部提供了一個(gè)removeEldestEntry方法,該方法正是實(shí)現(xiàn)LRU策略的關(guān)鍵所在, 且HashMap內(nèi)部專門為L(zhǎng)inkedHashMap提供了3個(gè)專用回調(diào)方法,afterNodeAccess、 afterNodeInsertion、afterNodeRemoval,這3個(gè)方法的字面意思非常容易理解,就是節(jié)點(diǎn)訪問(wèn)后、節(jié)點(diǎn)插入后、節(jié)點(diǎn)刪除后 分別執(zhí)行的行為?;谝陨闲袨長(zhǎng)inkedHashMap就可以實(shí)現(xiàn)一個(gè)LRUCache的功能了。

[[142638]]

關(guān)于LinkedHashMap的eldest:eldest字面意思為最老的,LinkedHashMap中有個(gè)叫做accessOrder的字 段,當(dāng)accessOrder為true時(shí)表示LinkedHashMap內(nèi)部節(jié)點(diǎn)按照訪問(wèn)次數(shù)排序,最老的節(jié)點(diǎn)也就是訪問(wèn)最少的節(jié)點(diǎn)。當(dāng) accessOrder為false時(shí)表示LinkedHashMap內(nèi)部節(jié)點(diǎn)按照插入順序排序,最老的節(jié)點(diǎn)也就是最早插入的節(jié)點(diǎn),該值默認(rèn)為 false。

實(shí)現(xiàn)

自己實(shí)現(xiàn)LRUCache只需覆蓋removeEldestEntry這個(gè)方法即可,代碼如下

private static class LRUCache<K, V> extends LinkedHashMap<K, V>
{
  private static final long serialVersionUID = -9111855653176630846L;
  private static int MAX_ELEMENTS;

  public LRUCache(int initCap, int maxSize) throws IllegalArgumentException
  {
   super(initCap, 0.75f, true);
   if (maxSize < 0)
    throw new IllegalArgumentException();
   MAX_ELEMENTS = maxSize;
  }

  @Override
  protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
  {
   return size() > MAX_ELEMENTS;
  }
}

以上代碼需要一個(gè)MAX_ELEMENTS變量限制***存儲(chǔ)節(jié)點(diǎn)個(gè)數(shù),插入節(jié)點(diǎn)時(shí)判斷 如果當(dāng) 前節(jié)點(diǎn)個(gè)數(shù)已經(jīng)超過(guò)了這個(gè)值則會(huì)根據(jù)LRU策略將訪問(wèn)最少的那個(gè)節(jié)點(diǎn)刪除,這里需要注意,默認(rèn)LinkedHashMap保證的是插入順序,也就是節(jié)點(diǎn)按 照插入先后來(lái)排序的,所以就算刪除也是刪除***插入的節(jié)點(diǎn),但是我們?cè)跇?gòu)造函數(shù)中傳入了一個(gè)true,這個(gè)參數(shù)決定了LinkedHashMap內(nèi)部的節(jié) 點(diǎn)按照什么方式排序,參數(shù)為true時(shí)說(shuō)明內(nèi)部節(jié)點(diǎn)按照最近訪問(wèn)的時(shí)間排序,為false時(shí)說(shuō)明按照插入順序排序。至此已完成了一個(gè)簡(jiǎn)易的 LRUCache實(shí)現(xiàn)。

注意

由于LinkedHahsMap本身實(shí)現(xiàn)不是線程安全的,也就是說(shuō)這個(gè)LRUCache也不是線程安全的,如果想要能多線程訪問(wèn)的話,可以這樣使用 它:LRUCache cache = Collections.synchronizedMap(new LRUCache(10, 10))。這樣cache就可以在多線程下執(zhí)行g(shù)et/put等操作了,但是,用這種方式得到的cache在多線程遍歷時(shí)還是不安全的。所以不能在多線程 下遍歷cache,官方文檔也建議在遍歷synchronizedmap時(shí)使用map本身做同步。

責(zé)任編輯:王雪燕 來(lái)源: codeceo
相關(guān)推薦

2022-06-17 07:49:14

緩存LRU

2020-02-19 19:18:02

緩存查詢速度淘汰算法

2020-10-30 11:30:15

Least Recen

2024-10-09 10:46:41

springboot緩存redis

2009-07-23 11:11:18

LRU緩存

2009-09-07 22:00:15

LINQ自定義

2022-05-18 07:44:13

自定義菜單前端

2015-07-15 10:19:16

Java代碼使用緩存

2021-09-26 05:02:00

緩存Ehcache用法

2011-12-16 14:23:51

Java

2023-10-19 09:14:34

Java開發(fā)

2015-02-12 15:33:43

微信SDK

2009-06-17 16:00:03

Hibernate自定

2009-09-03 13:34:03

.NET自定義控件

2013-01-09 17:22:38

Android開發(fā)Camera

2022-03-01 16:09:06

OpenHarmon鴻蒙單選組件

2022-12-07 08:56:27

SpringMVC核心組件

2022-04-01 15:59:22

SQLPostgreSQL審計(jì)

2023-01-03 07:40:27

自定義滑塊組件

2023-10-24 13:48:50

自定義注解舉值驗(yàn)證
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)