最近面了阿里的外包吧,居然也要在線敲代碼了,那叫一個緊張啊。題目就是實現一個LRU算法的緩存。外包居然要求也這麼高了,哎。還好,LRU是我大學老師布置的一道題目,當然我用C語言實現的,算法原理那是一清二楚,可是面試的時候就腦子一片空白了。好在,邊敲代碼,邊思考,就慢慢想起來了,下面是我的代碼。拉勾IT課程小編為大家分解:
/**
* 設計和構建一個「最近最少使用」LRU 緩存,該緩存會刪除最近最少使用的項目。
* 緩存應該從鍵映射到值(允許你插入和檢索特定鍵對應的值),並在初始化時指定最大容量。
* 當緩存被填滿時,它應該刪除最近最少使用的項目。
* 考慮多線程操作下的操作安全和性能。
*/
public class LRUCache{
private int maxSize;
/**
* 存儲緩存數據
*/
private ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>();
/**
**存儲緩存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裡取數據
Object obj = map.get(key);
//2.將key置於list的尾部(表示最近被訪問過了)
if(obj != null){
addOrRefreshKey(key);
}
}
synchronized void putVal(String key,Object val){
//1.設置val到map中
//2.將key置於list的尾部(表示最近被訪問過了)
//3.需要做判斷是否list.size()>maxSize。如果滿了就刪除頭部(最近最少使用)的數據後再執行1-2步驟
}
/**
* 添加或刷新key
*/
private void addOrRefreshKey(String key){
this.list.remove(key); //管他三七二十一,先刪除掉
this.list.add(key); //然後添加這個可以,保證key置於list的尾部
}
}