码迷,mamicode.com
首页 > 其他好文 > 详细

LRU

时间:2015-04-13 16:18:51      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

  简介:LRULeast Recently Used)最近最少使用页面置换算法,一种内存缓存机制。内部底层可以使用数组实现。因为手机分配给每一个程序的大小是固定的。

  为什么要用:程序的运行所需的内存空间超过手机分配的空间时,就会发生oomout of menory)。所以会有一些保持内存大小的机制,LRU就是其中一个。

  原理:本例中是用ArrayList模拟固定的内存空间(当然可能不是很合适,如果有更好的建议可以提出来切磋切磋)。测试数据为:23635414

  LRU顾名思义,就是先找到最近最少使用的资源,然后当空间不足时,就将其删掉。使用上面的测试数据,假设固定空间为5。存储前面三个数据(内存存储情况:236)直接存储,到第四个数据(3)时,3是最新数据,所以,数组的存储会变成(内存存储情况:2,63),但存储到第六个数据时(236354)内存固有空间刚好存满(内存存储情况:26354)。当再存入第七个数据(1)时,因为内存空间已经满了所以要删除最少使用的数据2.此时内存情况为(内存存储情况:63541

  具体实现请看代码:

 

import java.util.ArrayList;

//LRU(Least Recently Used)算法
public class LRU {
    public static final int MAX_MEMORY=5;
    // 假设这是存放资源,固定大小的一片空间
    ArrayList<Resourse> resoursesList=new ArrayList<LRU.Resourse>();
    
    public static void main(String[] args) {
        ArrayList<Resourse> list=new ArrayList<LRU.Resourse>();
        for(int i=0;i<10;i++){
            list.add(new Resourse(i));
                }
        
        LRU lru=new LRU();
        
        lru.put(list.get(2));
        lru.put(list.get(3));
        lru.put(list.get(6));
        lru.put(list.get(3));
        lru.put(list.get(5));
        lru.put(list.get(4));
        lru.put(list.get(1));
        lru.put(list.get(4));
        
    }
    
    // 是否已经是满了
    public boolean isMax(){
        if(getSize()>=MAX_MEMORY){
            return true;
        }else {
            return false;
        }
    }
    
    public int getSize(){
        return resoursesList.size();
    }
    
    /**
     * 
     * @param res 需要添加的元素
     * @return 返回删除的元素,如果没有删除元素则不会有返回值
     */
    public Resourse put(Resourse res){
        /*
         * 1)判断是否有包含需要添加的元素
         * 2)如果有包含删除原来的元素,直接在List后面添加,作为最新使用的元素
         * 3)如果没有包含,分两种情况,
         *         一、空间已经满了,删除第一个元素,再添加
         *         二、空间未满,空间未满直接添加
         */
        Resourse del=null;
        if(resoursesList.contains(res)){
            resoursesList.remove(res);
            resoursesList.add(res);
        }else{
            if(isMax()){
                del=resoursesList.remove(0);
                resoursesList.add(res);
            }else {
                resoursesList.add(res);
            }
        }
        print();
        return del;
    }
    
    //打印数据
    public void print(){
        for (Resourse res : resoursesList) {
            System.out.print(res.value+"  ");
        }
        System.out.println();
    }
    
    
    // 需要存储的资源类
    private static class Resourse{
        private int value;
        
        public Resourse(int value) {
            super();
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
        
    }
}

程序运行结果: 

技术分享

LRU

标签:

原文地址:http://www.cnblogs.com/flyfirst/p/4422092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!