修剪HashMap的有效方法

时间:2010-12-06 16:28:46

标签: java hashmap pruning

我正在用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++;
    }
}

4 个答案:

答案 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)

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

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

请注意,这是一个线程安全的并发映射,根据您的使用方式,它似乎很重要。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

数据库世界的一种可能性是拥有两个(或可能更多的地图)。查找使用两个地图。只写一个。当正在写入的容量达到容量时,替换/清除只读映射并切换。