java - 在 Java 中收缩 LinkedHashMap

标签 java caching iterator hashmap linkedhashmap

如何缩小 LinkedHashMap?我覆盖了 removeEldestEntry 方法,但此方法仅在插入新值时调用一次。因此,以这种方式缩小 map 没有任何变化。

LinkedHashMap 只给我一个普通的 Iterator 并且没有任何 removeLastlistIterator 方法,那么您如何才能找到最后的(比如 1000 个)条目并将其删除?

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

每次我想只删除几个元素时创建一个新 map 也会破坏内存。

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

编辑:对不起,迭代顺序是从旧到新。所以很简单

最佳答案

对于 LinekdHashMap,迭代器将从最老的到最年轻的进行迭代。如果您想将 LinkedHashMap 缩小到可以使用以下大小的大小。

Map<K,V> lhm =
int desiredSize = 
for(Iterator iter = lhm.keySet().iterator();iter.hasNext()) {
   if(lhm.size() <= desiredSize) break;
   iter.next();     //required else IllegalStateException since current=null 
   iter.remove();
}

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

关于java - 在 Java 中收缩 LinkedHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7250157/

相关文章:

generics - 在Rust中编写一个将可迭代容器作为参数的泛型函数

java - 如果你关闭一个关闭的连接会发生什么?

sql-server - SQL Server 2000 中的缓存功能结果

R Shiny - 缓存大数据帧

jquery - 悬停时更改 CSS 背景图像的最佳方法

iterator - 如何实现赋予结构生命周期的迭代器?

php - 基本迭代器类和字符串遍历

java - 如何使用 jtextfield 在 jtable 中搜索数据?

java - joda 期间返回 0 个月

java - 切入点表达式可以匹配Java方法中的泛型参数吗?