自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

背景

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

[[142638]]

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

實現(xiàn)

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

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;
  }
}

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

注意

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

責任編輯:王雪燕 來源: 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緩存

2015-07-15 10:19:16

Java代碼使用緩存

2022-05-18 07:44:13

自定義菜單前端

2021-09-26 05:02:00

緩存Ehcache用法

2009-09-07 22:00:15

LINQ自定義

2023-10-19 09:14:34

Java開發(fā)

2011-12-16 14:23:51

Java

2009-07-06 16:20:50

JSP自定義標簽

2013-01-09 17:22:38

Android開發(fā)Camera

2022-12-07 08:56:27

SpringMVC核心組件

2022-04-01 15:59:22

SQLPostgreSQL審計

2023-01-03 07:40:27

自定義滑塊組件

2009-09-03 13:34:03

.NET自定義控件

2022-03-01 16:09:06

OpenHarmon鴻蒙單選組件

2009-06-17 16:00:03

Hibernate自定

2023-10-24 13:48:50

自定義注解舉值驗證
點贊
收藏

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