private TreeMap<K, V>[] hashTable; privateint M; privateint size;
publicHashTable(int m){ M = m; size = 0; hashTable = new TreeMap[M]; for (int i = 0; i < M; i++) { hashTable[i] = new TreeMap<>(); } }
publicHashTable(){ this(initCapacity); }
privateinthash(K key){ return (key.hashCode() & 0x7fffffff) % M; }
publicintgetSize(){ return size; }
publicvoidadd(K key, V value){ TreeMap<K, V> map = hashTable[hash(key)]; if (map.containsKey(key)) { map.put(key, value); } else { map.put(key, value); size++; if (size >= upperTol * M) { resize(2 * M); } } }
public V remove(K key){ TreeMap<K, V> map = hashTable[hash(key)]; V ret = null; if (map.containsKey(key)) { ret = map.remove(key); size--; if (size < lowerTol * M && M / 2 > initCapacity) { resize(M / 2); } } return ret; }
privatevoidresize(int newM){ TreeMap<K, V>[] newHashTable = new TreeMap[newM]; for (int i = 0; i < newM; i++) { newHashTable[i] = new TreeMap<>(); } int oldM = M; this.M = newM; for (int i = 0; i < oldM; i++) { TreeMap<K, V> map = hashTable[i]; for (K k : map.keySet()) { newHashTable[hash(k)].put(k, map.get(k)); } } this.hashTable = newHashTable; }