java構(gòu)造簡(jiǎn)易的FIFO緩沖淘汰方法

在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;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,813評(píng)論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,734評(píng)論 18 399
  • 1.“省錢或賺錢”類 消費(fèi)者總是對(duì)省錢或賺錢感興趣,能夠幫助他們省錢或賺錢的產(chǎn)品很容易銷售??焖偈找娈a(chǎn)品在信息市場(chǎng)...
    天機(jī)易金會(huì)閱讀 792評(píng)論 0 1
  • 層次越高,越懂得尊重人。 層次高的人,他們更懂得“感同身受”和換位思考,知道每個(gè)人都不容易,懂得尊重別人。 01....
    菩提大叔閱讀 1,112評(píng)論 4 10

友情鏈接更多精彩內(nèi)容