我正在用Java创建一个Flyweight,我想确保我不会创建太大的地图。是否有更有效的方法来修剪地图?我没有看到任何可以自动执行此操作的属性(如max size构造函数),所以我在代码中执行此操作。
这是我拥有的,非常基本的,但我想确保没有更好的方法:
private static void prune() {
Iterator<Entry<Integer, Integer[]>> iterator = seeds.entrySet().iterator();
int removed = 0;
while(iterator.hasNext()|| removed == pruneLength) {
iterator.next();
iterator.remove();
removed++;
}
}
答案 0 :(得分:5)
LinkedHashMap可以用作LRU缓存。
Map<Integer, Integer[]> map = createLRUMap(128);
public static <K, V> Map<K, V> createLRUMap(final int maxSize) {
return new LinkedHashMap<K,V>(maxSize, 1, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return size() > maxSize;
}
};
}
答案 1 :(得分:3)
Guava的MapMaker在其最新版本(在主干上)中有这个。它应该在r08中,虽然我不知道什么时候会出现这种情况。
ConcurrentMap<Integer, Integer[]> seeds = new MapMaker()
.maximumSize(maxSize)
.makeMap();
请注意,这是一个线程安全的并发映射,根据您的使用方式,它似乎很重要。
答案 2 :(得分:1)
您是否考虑过使用缓存,例如EhCache?它们实现了地图,并且声明性地你可以设置大小,限制值存储在磁盘上等等。
答案 3 :(得分:0)
数据库世界的一种可能性是拥有两个(或可能更多的地图)。查找使用两个地图。只写一个。当正在写入的容量达到容量时,替换/清除只读映射并切换。