Ограничение максимального размера HashMap в Java

Я хочу ограничить максимальный размер HashMap чтобы принимать показатели по различным алгоритмам хеширования, которые я реализую. Я посмотрел на loadfactor в одном из перегруженных конструкторов HashMap .

 HashMap(int initialCapacity, float loadFactor) 

Я попытался установить loadFactor в 0.0f в конструкторе (это означает, что я не хочу, чтобы HashMap увеличивался в размере EVER), но javac называет это недопустимым:

 Exception in thread "main" java.lang.IllegalArgumentException: Illegal load factor: 0.0 at java.util.HashMap.(HashMap.java:177) at hashtables.CustomHash.(Main.java:20) at hashtables.Main.main(Main.java:70) Java Result: 1 

Есть ли другой способ ограничить размер HashMap чтобы он никогда не увеличивался?

Иногда проще.

 public class InstrumentedHashMap implements Map { private Map map; public InstrumentedHashMap() { map = new HashMap(); } public boolean put(K key, V value) { if (map.size() >= MAX && !map.containsKey(key)) { return false; } else { map.put(key, value); return true; } } ... } 

Вы можете создать новый class, подобный этому, чтобы ограничить размер HashMap:

 public class MaxSizeHashMap extends LinkedHashMap { private final int maxSize; public MaxSizeHashMap(int maxSize) { this.maxSize = maxSize; } @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > maxSize; } } 

Простое решение, как правило, лучшее, поэтому используйте немодифицируемый или неизменяемый hash.

Если вы не можете изменить количество элементов, тогда размер будет фиксированным – проблема решена.

 public class Cache { private LinkedHashMap Cache = null; private final int cacheSize; private ReadWriteLock readWriteLock=null; public Cache(LinkedHashMap psCacheMap, int size) { this.Cache = psCacheMap; cacheSize = size; readWriteLock=new ReentrantReadWriteLock(); } public void put(String sql, String pstmt) throws SQLException{ if(Cache.size() >= cacheSize && cacheSize > 0){ String oldStmt=null; String oldSql = Cache.keySet().iterator().next(); oldStmt = remove(oldSql); oldStmt.inCache(false); oldStmt.close(); } Cache.put(sql, pstmt); } public String get(String sql){ Lock readLock=readWriteLock.readLock(); try{ readLock.lock(); return Cache.get(sql); }finally{ readLock.unlock(); } } public boolean containsKey(String sql){ Lock readLock=readWriteLock.readLock(); try{ readLock.lock(); return Cache.containsKey(sql); }finally{ readLock.unlock(); } } public String remove(String key){ Lock writeLock=readWriteLock.writeLock(); try{ writeLock.lock(); return Cache.remove(key); }finally{ writeLock.unlock(); } } public LinkedHashMap getCache() { return Cache; } public void setCache( LinkedHashMap Cache) { this.Cache = Cache; } } 

Метод, put в class HashMap, отвечает за добавление элементов в HashMap, и он делает это, вызывая метод с именем addEntry, код которого выглядит следующим образом:

  void addEntry(int hash, K key, V value, int bucketIndex) { Entry e = table[bucketIndex]; table[bucketIndex] = new Entry(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); } 

Как видно из этого метода, HashMap изменяется, если порог превышен, поэтому я бы попытался расширить class HashMap и написать собственные методы для put и addEntry , чтобы удалить изменение размера. Что-то вроде:

 package java.util; public class MyHashMap extends HashMap { private V myPutForNullKey(V value) { for (Entry e = table[0]; e != null; e = e.next) { if (e.key == null) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; myAddEntry(0, null, value, 0); return null; } public V myPut(K key, V value) { if (key == null) return myPutForNullKey(value); if (size < table.length) { int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; myAddEntry(hash, key, value, i); } return null; } void myAddEntry(int hash, K key, V value, int bucketIndex) { Entry e = table[bucketIndex]; table[bucketIndex] = new Entry(hash, key, value, e); size++; } } 

Вам нужно будет написать свои собственные методы, поскольку put и addEntry не могут быть переопределяющими, и вам также нужно будет сделать то же самое для putForNullKey поскольку он вызывается внутри put . Для проверки того, что мы не пытаемся поместить объект, если таблица заполнена, требуется проверка в put .

  • Как я могу попросить Selenium-WebDriver ждать несколько секунд в Java?
  • Скрыть скрытые параметры с помощью response.sendRedirect ()
  • Чтение GZIPInputStream по строкам
  • Как добавить узел в существующий файл XML в java
  • Как расшифровать файл в Java, зашифрованном с помощью команды openssl, используя AES?
  • Можно ли отключить HttpSession в web.xml?
  • Java: преобразовать строку в TimeStamp
  • Класс помощника JSP для печати содержимого
  • Добавление ChartPanel в JTabbedPane с использованием JPanel
  • @OneToMany и составные первичные ключи?
  • Как проверить, что Java String не все пробелы?
  • Interesting Posts

    В чем разница между parent.frame () и parent.env () в R; как они отличаются при вызове по ссылке?

    Как получить «кодовое обозначение» gdb на OSX?

    Согласование нескольких шаблонов

    Печать строк UTF-8 с помощью printf-wide или многобайтовых строковых литералов

    Ошибка синтаксиса из-за использования зарезервированного слова в качестве имени таблицы или столбца в MySQL

    AngularJS – удалять пробелы в верхнем и заднем пространстве из поля ввода с использованием регулярного выражения

    Java, 3 точки в параметрах

    Неудача успеха Параметр в jQuery.ajax?

    Почему NoClassDefFoundError вызвано сбоем инициализации статического поля?

    обратимый «бинарный номер» предикат

    C оптимизация строковых литералов

    Почему gc () не освобождает память?

    Невозможно решить метод setLatestEventInfo

    C ++: как требовать, чтобы один тип шаблона был получен из другого

    Как избежать зарезервированного слова в Oracle?

    Давайте будем гением компьютера.