JAVA實(shí)現(xiàn)LRU算法的參考示例
LRU簡(jiǎn)介
LRU是Least Recently Used 近期最少使用算法,它就可以將長(zhǎng)時(shí)間沒(méi)有被利用的數(shù)據(jù)進(jìn)行刪除。
實(shí)現(xiàn)
最近面了阿里的外包吧,居然也要在線敲代碼了,那叫一個(gè)緊張啊。題目就是實(shí)現(xiàn)一個(gè)LRU算法的緩存。外包居然要求也這么高了,哎。還好,LRU是我大學(xué)老師布置的一道題目,當(dāng)然我用C語(yǔ)言實(shí)現(xiàn)的,算法原理那是一清二楚,可是面試的時(shí)候就腦子一片空白了。好在,邊敲代碼,邊思考,就慢慢想起來(lái)了,下面是我的代碼。僅供參考
/** * 設(shè)計(jì)和構(gòu)建一個(gè)“最近最少使用”LRU 緩存,該緩存會(huì)刪除最近最少使用的項(xiàng)目。 * 緩存應(yīng)該從鍵映射到值(允許你插入和檢索特定鍵對(duì)應(yīng)的值),并在初始化時(shí)指定最大容量。 * 當(dāng)緩存被填滿時(shí),它應(yīng)該刪除最近最少使用的項(xiàng)目。 * 考慮多線程操作下的操作安全和性能。 */public class LRUCache{ private int maxSize; /** * 存儲(chǔ)緩存數(shù)據(jù) */ private ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>(); /** **存儲(chǔ)緩存key列表 */ private LinkedList<String> list; LRUCache(){ } LRUCache(int maxSize){ this.maxSize = maxSize; this.list = new LinkedList<>(maxSize); } /** * @param key 緩存key @return 緩存值 */ synchronized Object getVal(String key){ //1.從map里取數(shù)據(jù) Object obj = map.get(key); //2.將key置于list的尾部(表示最近被訪問(wèn)過(guò)了) if(obj != null){ addOrRefreshKey(key); } } synchronized void putVal(String key,Object val){ //1.設(shè)置val到map中 //2.將key置于list的尾部(表示最近被訪問(wèn)過(guò)了) //3.需要做判斷是否list.size()>maxSize。如果滿了就刪除頭部(最近最少使用)的數(shù)據(jù)后再執(zhí)行1-2步驟 } /** * 添加或刷新key */ private void addOrRefreshKey(String key){ this.list.remove(key); //管他三七二十一,先刪除掉 this.list.add(key); //然后添加這個(gè)可以,保證key置于list的尾部 } }
以上就是JAVA實(shí)現(xiàn)LRU算法的參考示例的詳細(xì)內(nèi)容,更多關(guān)于Java LRU算法的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 不要在HTML中濫用div2. HTML5實(shí)戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)3. CSS百分比padding制作圖片自適應(yīng)布局4. React優(yōu)雅的封裝SvgIcon組件示例5. Vue如何使用ElementUI對(duì)表單元素進(jìn)行自定義校驗(yàn)及踩坑6. vue前端RSA加密java后端解密的方法實(shí)現(xiàn)7. CSS清除浮動(dòng)方法匯總8. Electron調(diào)用外接攝像頭并拍照上傳實(shí)現(xiàn)詳解9. HTTP協(xié)議常用的請(qǐng)求頭和響應(yīng)頭響應(yīng)詳解說(shuō)明(學(xué)習(xí))10. TypeScript實(shí)現(xiàn)十大排序算法之歸并排序示例詳解
