2010-12-06 5 views
1

Я создаю Flyweight на Java, и я хочу убедиться, что я не создаю слишком большую карту. Есть ли более эффективный способ обрезания карты? Я не видел никаких свойств, которые могли бы сделать это автоматически (например, конструктор максимального размера), поэтому я делаю это в коде.Эффективный способ обрезания HashMap

Вот что у меня есть, его довольно простой, но я хочу, чтобы убедиться, что это не лучший способ:

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

Вы имеете в виду, что пытаетесь избежать карты с широким распространением ключей или? – 2010-12-06 16:33:03

+2

Почему бы не использовать `iterator.remove()`? Это отражается на карте. – 2010-12-06 16:34:28

+0

Я хочу ограничить этот рост карт с течением времени. Я не должен часто использовать этот предел ... – Nix 2010-12-06 16:38:06

ответ

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

Рассматривали ли вы с помощью кэши, EhCache к примеру? Они реализуют карты и декларативно вы можете установить размер, предел после сохранения значений на диске и т. Д.

3

Guava «s MapMaker имеет это в своей последней версии (на стволе). Это должно быть в r08, хотя я не знаю, когда это выйдет точно.

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

Обратите внимание, что это потокобезопасная параллельная карта, которая, похоже, может быть важной в зависимости от того, как вы ее используете.

0

Одна возможность из мира баз данных состоит в том, чтобы иметь две (или потенциально больше карт). Поиск использует обе карты. Пишет только один. Когда один из них записывается в емкость, замените/очистите карту и переключатель только для чтения.