HashMap实现LRU(最近最少使用)缓存更新算法
生活随笔
收集整理的這篇文章主要介紹了
HashMap实现LRU(最近最少使用)缓存更新算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近阿里巴巴電話面試被問到了如何使用固定容量的HashMap,實現LRU算法。當時一臉懵逼,平時用HashMap也就用來快速存取數據而已,容量都是不限的。
想了半天,想到對node節點進行擴展,加入引用計數,然后到達指定容量后,刪除引用計數最少的。
面試官質疑這樣效率太低了,能不能優化下。
想到刪除時,需要遍歷所有元素,代價為O(n),太大了。想到可以用最小堆來進行篩選。被問到建堆的節點值是什么,這塊沒想好,卡殼了。
面試完之后,網上搜了下,才發現Java官方已經替我們預留了LRU算法的框架,在LinkedHashMap里。我們只需要擴展下即可,代碼示例如下:
/*** Constructs an empty <tt>LinkedHashMap</tt> instance with the* specified initial capacity, load factor and ordering mode.** @param initialCapacity the initial capacity* @param loadFactor the load factor* @param accessOrder the ordering mode - <tt>true</tt> for* access-order, <tt>false</tt> for insertion-order* @throws IllegalArgumentException if the initial capacity is negative* or the load factor is nonpositive*/public LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) {super(initialCapacity, loadFactor);this.accessOrder = accessOrder;}//方法為protected ,擺明了是想被繼承、重寫protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {return false;}使用accessOrder來標識是使用訪問順序,還是插入順序。默認為插入順序。當accessOrder為訪問順序、容量固定時,即為LRU
舉例如下:
總結
以上是生活随笔為你收集整理的HashMap实现LRU(最近最少使用)缓存更新算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 山药排骨汤的功效与作用、禁忌和食用方法
- 下一篇: 分布式ID生成方法