1 package com.xy.thread;
  2 
  3 import java.util.HashMap;
  4 import java.util.Iterator;
  5 import java.util.Set;
  6 
  7 public class LRU
  8 {
  9     protected HashMap lruCache = new HashMap(2);
 10     //可操作的最大使用次数
 11     protected int MAX_INTEGER_NUMBER=2147483647;
 12     //缓存中保存的数大对象数目
 13     protected int max_object_num=1000;
 14     public LRU()
 15     {
 16     }
 17     
 18     public LRU(int maxObjectNum)
 19     {
 20         
 21         max_object_num=maxObjectNum;
 22     }
 23     
 24     
 25     
 26     /**
 27      * 增加对象到缓存中
 28      * @param key
 29      * @param value
 30      */
 31     public Object put(Object key, Object value)
 32     {
 33         CacheObject newValue = new CacheObject(value);
 34         if (lruCache.size()>=max_object_num)
 35         {
 36             removeLease();
 37         }
 38         
 39         return lruCache.put(key, newValue);
 40     }
 41     
 42     /**
 43      * 使用key来获取对象
 44      * 
 45      * @param key
 46      * @return
 47      */
 48     public Object get(Object key)
 49     {
 50         CacheObject object=(CacheObject)lruCache.get(key);
 51         if (object==null)
 52         {
 53             return null;
 54         }
 55         //根据LRU算法原则,将命中的对象计算器0,将其他对象的计算值加1
 56         Set set=lruCache.keySet();
 57         Iterator iter=set.iterator();
 58         Object keyObject=null;
 59         CacheObject cacheObject=null;
 60         while(iter.hasNext())
 61         {
 62             keyObject=iter.next();
 63             cacheObject=(CacheObject) lruCache.get(keyObject);
 64             cacheObject.setUsetimes(cacheObject.getUsetimes()+1);
 65         }
 66         object.setUsetimes(0);
 67         
 68   return object!=null? object.getValue():null;
 69     }
 70     public boolean containsKey(Object key)
 71     {
 72         return lruCache.containsKey(key);
 73     }
 74     public void clear()
 75     {
 76         lruCache.clear();
 77     }
 78     public int size()
 79     {
 80         return lruCache.size();
 81     }
 82     public boolean isEmpty()
 83     {
 84         return lruCache.isEmpty();
 85     }
 86     public boolean containsValue(Object value)
 87     {
 88         return lruCache.containsKey(value);
 89     }
 90     /**
 91      * 移除使用最少的对象
 92      */
 93     public void removeLease()
 94     {
 95         Object leaseUseObjectKey=null;
 96         int usetimes=0;
 97         Set set=lruCache.keySet();
 98         Iterator iter=set.iterator();
 99         while(iter.hasNext())
100         {
101             Object keyObject=iter.next();
102             CacheObject object=(CacheObject) lruCache.get(keyObject);
103             if (object.getUsetimes()>usetimes)
104             {
105                 usetimes=object.getUsetimes();
106                 leaseUseObjectKey=keyObject;
107             }
108         }
109         lruCache.remove(leaseUseObjectKey);
110     }
111     public Set keySet()
112     {
113         return lruCache.keySet();
114     }
115     /**
116      * 移除使用最频繁的对象
117      */
118     public void removeMost()
119     {
120         Object leaseUseObjectKey=null;
121         int usetimes=MAX_INTEGER_NUMBER;
122         Set set=lruCache.keySet();
123         Iterator iter=set.iterator();
124         while(iter.hasNext())
125         {
126             Object keyObject=iter.next();
127             CacheObject object=(CacheObject) lruCache.get(keyObject);
128             if (object.getUsetimes()<usetimes)
129             {
130                 usetimes=object.getUsetimes();
131                 leaseUseObjectKey=keyObject;
132             }
133         }
134         lruCache.remove(leaseUseObjectKey);
135     }
136     
137     /**
138      * 移除最早置入缓存的对象
139      */
140     public void removeEarly()
141     {
142         Object leaseUseObjectKey=null;
143         long time=System.currentTimeMillis()+365*24*60*60*1000;
144         Set set=lruCache.keySet();
145         Iterator iter=set.iterator();
146         while(iter.hasNext())
147         {
148             Object keyObject=iter.next();
149             CacheObject object=(CacheObject) lruCache.get(keyObject);
150             if (object.getPushtime()<time)
151             {
152                 time=object.getPushtime();
153                     leaseUseObjectKey=keyObject;
154             }
155         }
156         lruCache.remove(leaseUseObjectKey);        
157     }
158     
159     /**
160      * 移除最迟放入的对象
161      */
162     public void removeLater()
163     {
164         Object leaseUseObjectKey=null;
165         long time=-1;
166         Set set=lruCache.keySet();
167         Iterator iter=set.iterator();
168         while(iter.hasNext())
169         {
170             Object keyObject=iter.next();
171             CacheObject object=(CacheObject) lruCache.get(keyObject);
172             if (object.getPushtime()>time)
173             {
174                 time=object.getPushtime();
175                 leaseUseObjectKey=keyObject;
176             }
177         }
178         lruCache.remove(leaseUseObjectKey);       
179     }    
180     
181     /**
182      * 删除某个键值及对应对象
183      * @param key
184      */
185     public void remove(Object key)
186     {
187         lruCache.remove(key);
188     }
189     
190     public static void main(String[] args)
191     {
192         LRU lru = new LRU(4);
193         lru.put("a","The A String");
194         lru.put("b","The B String");
195         lru.put("d","The D String");
196         lru.put("c","The C String");
197         
198         System.out.println(lru.toString()+"-----------------------------------------------");     
199         
200         lru.get("a");
201         lru.get("b");
202         lru.get("d");
203         lru.get("a");
204         lru.get("b");
205         lru.get("d");
206         lru.put("e","The E String");
207         lru.get("e");
208         lru.get("e");
209         lru.get("e");
210         lru.get("e");
211         System.out.println(lru.toString());
212     }
213     public String toString()
214     {
215         StringBuffer strBf= new StringBuffer(10);
216         Set set1=lruCache.keySet();
217         Iterator iter1=set1.iterator();
218         while(iter1.hasNext())
219         {
220             Object key=iter1.next();
221             strBf.append(key+"=");
222             strBf.append(lruCache.get(key));
223             strBf.append("\n");
224         }
225         return strBf.toString();
226     }
227     
228   
229 }

 

 1 package com.xy.thread;
 2 
 3 /*
 4  * Created on 2004-9-7
 5  *
 6  * TODO To change the template for this generated file go to
 7  * Window - Preferences - Java - Code Style - Code Templates
 8  */
 9 /**
10  *
11  * TODO To change the template for this generated type comment go to
12  * Window - Preferences - Java - Code Style - Code Templates
13  */
14 public class CacheObject
15 {
16     long pushtime = 0;
17     int usetimes = 0;
18     Object value = null;
19     CacheObject( Object value )
20     {
21         pushtime = System.currentTimeMillis();
22         usetimes = 0;
23         this.value = value;
24     }
25     
26     /**
27      * @return Returns the pushtime.
28      */
29     public final long getPushtime()
30     {
31         return pushtime;
32     }
33     
34     /**
35      * @return Returns the usetimes.
36      */
37     public final int getUsetimes()
38     {
39         return usetimes;
40     }
41     /**
42      * @param usetimes The usetimes to set.
43      */
44     public final void setUsetimes(int usetimes)
45     {
46         this.usetimes = usetimes;
47     }
48     /**
49      * @return Returns the value.
50      */
51     public final Object getValue()
52     {
53         return value;
54     }
55     /**
56      * @param value The value to set.
57      */
58     public final void setValue(Object value)
59     {
60         this.value = value;
61     }
62         
63     public String toString()
64     {
65         StringBuffer strBf=new StringBuffer(10);
66         strBf.append("value="+value+"\n");
67         strBf.append("pushtime="+pushtime+"\n");
68         strBf.append("usetimes="+usetimes+"\n");
69         return strBf.toString();
70     }
71 }