如何缩小LinkedHashMap
?我覆盖了removeEldestEntry
方法,但只在插入新值时才调用此方法一次。因此,没有任何改变使地图变小。
LinkedHashMap
仅提供正常的Iterator
且没有任何removeLast
或listIterator
方法,那么如何才能找到最后的1000个条目并删除它们?
我能想到的唯一方法是迭代整个事情。但这可能需要很长时间......
每次我想删除少量元素时创建一个新地图也会破坏内存。
在Iterator
方法中减少maxSize
时,可能会移除removeEldestEntry
的第一个值,然后重新插入它们。然后重新插入将踢出最旧的值。这是非常难看的代码......有什么更好的想法吗?
编辑:Sry迭代顺序是最年轻的。所以很容易
答案 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