我正在尝试将java.util.Hashtable
实施到我的项目中,但是我不确定它是否可以支持我正在寻找的功能。
我希望能够使用java.util.Hashtable
但是在rehash上我不想将原始哈希表中的数据复制到新的更大哈希表中。
有没有办法用java.util.Hashtable
执行此操作?
(基本上我需要它来存储一些我不想重新计算的值。由于应用程序运行原始值,我需要的存储将越来越少,因此对于性能而言,最好只是摆脱它们并开始再次使用新的,更需要的值。最好的地方就是重新运行,因为我可以从典型的rehash过程中删除复制步骤。)
答案 0 :(得分:2)
不要使用Hashtable
。它是JDK 1.0的遗留遗留物,它在不同的点上不必要地同步。
相反,您可以使用HashMap
。它没有提供一个显式的rehash方法,但它会在它加载太多时自动重新组合。您可以通过初始化appropriate constructor中的loadFactor
来控制这种情况发生的频率。如果loadFactor
足够大,那么这种重复将永远不会发生。
答案 1 :(得分:1)
clear()
方法用于清除哈希表。在刷新时使用hashTable.clear();
清除哈希表。
答案 2 :(得分:1)
基本上我需要它来存储一些我不想重新计算的值。随着应用程序运行原始值我需要越来越少,因此对于性能而言,最好只是摆脱它们并重新开始使用新的,更需要的值。
因此,您希望拥有一个最近添加的驱逐策略的缓存。最简单的实现如下:
class LRACache<K, V> extends LinkedHashMap<K, V> {
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
return size() > 100;
}
}
通过调用LinkedHashMap的不同构造函数,您也可以改为最近最少使用(即请求)的元素。
测试代码:
public class Test {
public static void main(String[] args) throws Exception {
LRACache<Integer, Integer> cache = new LRACache<>();
for (int i = 0; i < 200; i++) {
cache.put(i, i);
}
if (cache.containsKey(1)) {
throw new AssertionError();
}
if (!cache.containsKey(100)) {
throw new AssertionError();
}
System.out.println(cache);
}
}
答案 3 :(得分:1)
看看LinkedHashMap
。它是一个hashmap,允许您按照将值输入哈希映射的顺序进行迭代。
它可以被子类化,并且removedEldestEntry()
被覆盖,以设置一个策略,在插入新条目时,最长的条目将被删除。如果列表已达到一定大小,或者最老条目有一些时间字段可以测试,则可以执行此操作等。
如果您认为合适,这将使您能够摆脱旧条目,而无需将新条目复制到新地图。或者,如果您认为合适,可以使用订单迭代器跳过旧条目并仅将新条目复制到新的空哈希映射。