1

我正在用 Java 创建一个享元,我想确保我不会创建太大的地图。有没有更有效的方法来修剪地图?我没有看到任何可以自动执行此操作的属性(例如最大大小构造函数),因此我在代码中执行此操作。

这是我所拥有的,它非常基本,但我想确保没有更好的方法:

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++;
    }
}
4

4 回答 4

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;
        }
    };
}
于 2010-12-06T16:33:51.567 回答
3

GuavaMapMaker在其最新版本中有这个(在树干上)。它应该在 r08 中,虽然我不知道它什么时候出来。

ConcurrentMap<Integer, Integer[]> seeds = new MapMaker()
     .maximumSize(maxSize)
     .makeMap();

Note that this is a thread-safe concurrent map, which seems like it might be important depending on how you're using it.

于 2010-12-06T16:46:14.680 回答
1

您是否考虑过使用缓存,例如EhCache ?它们实现了映射,并且可以声明式地设置大小、值存储在磁盘上后的限制等。

于 2010-12-06T16:33:49.753 回答
0

One possibility from the world of databases is to have two (or potentially more maps). Lookups use both maps. Writes to just one. When the one being written hits capacity, replace/clear the read-only map and switch.

于 2010-12-06T16:56:11.923 回答