博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LRUCache
阅读量:6040 次
发布时间:2019-06-20

本文共 4191 字,大约阅读时间需要 13 分钟。

//
 Copyright 2007 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland
//
 www.source-code.biz, www.inventec.ch/chdh
//
//
 This module is multi-licensed and may be used under the terms
//
 of any of the following licenses:
//
//
  EPL, Eclipse Public License, V1.0 or later, 
http://www.eclipse.org/legal
//
  LGPL, GNU Lesser General Public License, V2 or later, 
http://www.gnu.org/licenses/lgpl.html
//
  GPL, GNU General Public License, V2 or later, 
http://www.gnu.org/licenses/gpl.html
//
  AL, Apache License, V2.0 or later, 
http://www.apache.org/licenses
//
  BSD, BSD License, 
http://www.opensource.org/licenses/bsd-license.php
//
//
 Please contact the author if you need another license.
//
 This module is provided "as is", without warranties of any kind.
import java.util.LinkedHashMap;
import java.util.Collection;
import java.util.Map;
import java.util.ArrayList;
/**
* An LRU cache, based on <code>LinkedHashMap</code>.
*
* <p>
* This cache has a fixed maximum number of elements (<code>cacheSize</code>).
* If the cache is full and another entry is added, the LRU (least recently used) entry is dropped.
*
* <p>
* This class is thread-safe. All methods of this class are synchronized.
*
* <p>
* Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br>
* Multi-licensed: EPL / LGPL / GPL / AL / BSD.
*/
public 
class LRUCache<K,V> {
private 
static 
final 
float   hashTableLoadFactor = 0.75f;
private LinkedHashMap<K,V>   map;
private 
int                  cacheSize;
/**
* Creates a new LRU cache.
@param
 cacheSize the maximum number of entries that will be kept in this cache.
*/
public LRUCache (
int cacheSize) {
   
this.cacheSize = cacheSize;
   
int hashTableCapacity = (
int)Math.ceil(cacheSize / hashTableLoadFactor) + 1;
   map = 
new LinkedHashMap<K,V>(hashTableCapacity, hashTableLoadFactor, 
true) {
      
//
 (an anonymous inner class)
      
private 
static 
final 
long serialVersionUID = 1;
      @Override 
protected 
boolean removeEldestEntry (Map.Entry<K,V> eldest) {
         
return size() > LRUCache.
this.cacheSize; }}; }
/**
* Retrieves an entry from the cache.<br>
* The retrieved entry becomes the MRU (most recently used) entry.
@param
 key the key whose associated value is to be returned.
@return
    the value associated to this key, or null if no value with this key exists in the cache.
*/
public 
synchronized V get (K key) {
   
return map.get(key); }
/**
* Adds an entry to this cache.
* The new entry becomes the MRU (most recently used) entry.
* If an entry with the specified key already exists in the cache, it is replaced by the new entry.
* If the cache is full, the LRU (least recently used) entry is removed from the cache.
@param
 key    the key with which the specified value is to be associated.
@param
 value  a value to be associated with the specified key.
*/
public 
synchronized 
void put (K key, V value) {
   map.put (key, value); }
/**
* Clears the cache.
*/
public 
synchronized 
void clear() {
   map.clear(); }
/**
* Returns the number of used entries in the cache.
@return
 the number of entries currently in the cache.
*/
public 
synchronized 
int usedEntries() {
   
return map.size(); }
/**
* Returns a <code>Collection</code> that contains a copy of all cache entries.
@return
 a <code>Collection</code> with a copy of the cache content.
*/
public 
synchronized Collection<Map.Entry<K,V>> getAll() {
   
return 
new ArrayList<Map.Entry<K,V>>(map.entrySet()); }
//
 end class LRUCache
import java.util.Map;
//
 Test program for the LRUCache class.
public 
class TestLRUCache {
public 
static 
void main (String[] args) {
   LRUCache<String,String> c = 
new LRUCache<String, String>(3);
   c.put ("1", "one");                           
//
 1
   c.put ("2", "two");                           
//
 2 1
   c.put ("3", "three");                         
//
 3 2 1
   c.put ("4", "four");                          
//
 4 3 2
   
if (c.get("2") == 
null
throw 
new Error();    
//
 2 4 3
   c.put ("5", "five");                          
//
 5 2 4
   c.put ("4", "second four");                   
//
 4 5 2
   
//
 Verify cache content.
   
if (c.usedEntries() != 3)              
throw 
new Error();
   
if (!c.get("4").equals("second four")) 
throw 
new Error();
   
if (!c.get("5").equals("five"))        
throw 
new Error();
   
if (!c.get("2").equals("two"))         
throw 
new Error();
   
//
 List cache content.
   
for (Map.Entry<String, String> e : c.getAll())
      System.out.println (e.getKey() + " : " + e.getValue()); }
//
 end class TestLRUCache

转载地址:http://iurhx.baihongyu.com/

你可能感兴趣的文章
常用的集合
查看>>
Unity3D工程源码目录
查看>>
杀死进程命令
查看>>
cookie 和session 的区别详解
查看>>
Mongodb对集合(表)和数据的CRUD操作
查看>>
Target runtime Apache Tomcat is not defined.错误解决方法
查看>>
VC++ 监视文件(夹)
查看>>
【转】keyCode对照表及JS监听组合按键
查看>>
[Java开发之路](14)反射机制
查看>>
mac gentoo-prefix安装git svn
查看>>
浅尝异步IO
查看>>
C - Train Problem II——(HDU 1023 Catalan 数)
查看>>
Speak loudly
查看>>
iOS-在项目中引入RSA算法
查看>>
[译] 听说你想学 React.js ?
查看>>
gulp压缩合并js与css
查看>>
块级、内联、内联块级
查看>>
Predicate
查看>>
[面试题记录01]实现一个function sum达到一下目的
查看>>
这个季节的忧伤,点到为止
查看>>