I want to limit the maximum size of a HashMap
to take metrics on a variety of hashing algorithms that I'm implementing. I looked at the loadfactor in one of HashMap
's overloaded constructors.
HashMap(int initialCapacity, float loadFactor)
I tried setting the loadFactor to 0.0f in the constructor (meaning that I don't want the HashMap to grow in size EVER) but javac
calls this invalid:
Exception in thread "main" java.lang.IllegalArgumentException: Illegal load factor: 0.0 at java.util.HashMap.<init>(HashMap.java:177) at hashtables.CustomHash.<init>(Main.java:20) at hashtables.Main.main(Main.java:70) Java Result: 1
Is there another way to limit the size of HashMap
so it doesn't grow ever?
In Sun's JVM, HashMap uses an array which is a power of 2. The largest power of two allowed for an array size is 2^30 . And the largest number of elements you can have before the HashMap will try to double its size to 2^31 (which it cannot do) is ( 2^30 * loadFactor ) or about 700 million for the default load factor.
HashMap size() Method in Java util. HashMap. size() method of HashMap class is used to get the size of the map which refers to the number of the key-value pair or mappings in the Map.
There is no theoretical limit, but there is a limit of buckets to store different entry chains (stored under a different hashkey).
You could create a new class like this to limit the size of a HashMap:
public class MaxSizeHashMap<K, V> extends LinkedHashMap<K, V> { private final int maxSize; public MaxSizeHashMap(int maxSize) { this.maxSize = maxSize; } @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > maxSize; } }
Sometimes simpler is better.
public class InstrumentedHashMap<K, V> implements Map<K, V> { private Map<K, V> map; public InstrumentedHashMap() { map = new HashMap<K, V>(); } public boolean put(K key, V value) { if (map.size() >= MAX && !map.containsKey(key)) { return false; } else { map.put(key, value); return true; } } ... }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With