在Java中缩小LinkedHashMap

时间:2011-08-30 21:41:09

标签: java caching iterator hashmap linkedhashmap

如何缩小LinkedHashMap?我覆盖了removeEldestEntry方法,但只在插入新值时才调用此方法一次。因此,没有任何改变使地图变小。

LinkedHashMap仅提供正常的Iterator且没有任何removeLastlistIterator方法,那么如何才能找到最后的1000个条目并删除它们?

我能想到的唯一方法是迭代整个事情。但这可能需要很长时间......

每次我想删除少量元素时创建一个新地图也会破坏内存。

Iterator方法中减少maxSize时,可能会移除removeEldestEntry的第一个值,然后重新插入它们。然后重新插入将踢出最旧的值。这是非常难看的代码......有什么更好的想法吗?

编辑:Sry迭代顺序是最年轻的。所以很容易

2 个答案:

答案 0 :(得分:5)

对于LinekdHashMap,迭代器将从最旧到迭代迭代。如果您想将LinkedHashMap缩小到可以使用以下内容的大小。

Map<K,V> lhm =
int desiredSize = 
for(Iterator iter = lhm.keySet().iterator();iter.hasNext()) {
   if(lhm.size() <= desiredSize) break;
   iter.remove();
}

每个条目删除大约需要20 ns。

答案 1 :(得分:0)

LRU高速缓存实现,它使用LinkedHashMap(有序访问)。通过调用者的通知回调中注册/订阅了此类事件的返回值,它还可以动态地执行收缩和扩展操作。

对代码进行了很好的注释以详细说明实现。

caracter

使用此LRU缓存实现的测试类:

 DECLARE @frase VARCHAR (100)
 DECLARE MICURSOR CURSOR FOR SELECT caracter FROM t1 
 OPEN MICURSOR
 FETCH NEXT FROM MICURSOR 

 WHILE @@fetch_status = 0

 BEGIN

 SELECT t1.caracter FROM t1 INNER JOIN t2 
 ON t2.frase LIKE CONCAT('%', t1.caracter,'%')
 UPDATE t1 SET caracter=  'caracter' + '(@frase-1)'

  FETCH NEXT FROM MICURSOR INTO @frase
END
CLOSE MICURSOR
DEALLOCATE MICURSOR