在java中,通??梢允褂肏ashMap作為cache來(lái)加速程序的運(yùn)行。一般地,若對(duì)一個(gè)方法的結(jié)果進(jìn)行緩沖,僅需要將方法的參數(shù)列表作為key,方法的返回結(jié)果作為value即可。
但若程序?qū)υ摲椒ㄔL問(wèn)過(guò)于頻繁,大量的緩沖信息占用大量?jī)?nèi)存,嚴(yán)重的情況下會(huì)導(dǎo)致內(nèi)存不足而異常退出。如果可以在HashMap達(dá)到一定大小后,自動(dòng)刪除最早放入HashMap那部分?jǐn)?shù)據(jù),就可以達(dá)到緩沖大小的控制。然而,HashMap是一個(gè)無(wú)序的數(shù)據(jù)結(jié)構(gòu),我們并不能從HashMap中獲取到每條記錄入庫(kù)的先后順序。
解決方法:可以使用List嵌套HashMap的方法來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的FIFO緩沖淘汰方法。list中可以放4個(gè)HashMap,有限填寫list中的第一個(gè)HashMap,當(dāng)HashMap填寫了1000條時(shí),則將list最后一個(gè)HashMap從list刪除,在list第一個(gè)位置插入一個(gè)新的HashMap。
通過(guò)如上方法構(gòu)造的緩沖區(qū)最多存儲(chǔ)4000條信息,當(dāng)達(dá)到4000條信息后,會(huì)自動(dòng)清理最先進(jìn)入緩沖區(qū)的1000條信息。
使用該方法的代價(jià)是判斷一條數(shù)據(jù)在不在緩沖區(qū)中時(shí)需要訪問(wèn)4個(gè)HashMap并調(diào)用containsKey。此代價(jià)相對(duì)于緩沖的方法來(lái)說(shuō)可忽略不計(jì)。
下面是一些代碼的片段
class BufferMap<K,V>{
private static final int QUEUE_LEN=4;
ArrayList<HashMap<K,V>> queue = new ArrayList<>();
private final int buffersize;
public BufferMap(int buffersize){
this.buffersize=buffersize;
for(int i=0;i<QUEUE_LEN;i++){
queue.add(new HashMap<K,V>());
}
}
public void put(K key,V value){
if(queue.get(queue.size()-1).size()>=buffersize/QUEUE_LEN && !queue.get(queue.size()-1).containsKey(key)){
HashMap<K, V> remove = queue.remove(0);
remove.clear();
queue.add(remove);
}
queue.get(queue.size()-1).put(key, value);
}
public V get(K key){
for(HashMap<K,V> hm:queue){
if(hm.containsKey(key)){
return hm.get(key);
}
}
return null;
}
}