Nézzük meg a rehash() függvényt is:
/**
* Increases the capacity of and internally reorganizes this hashtable, in
* order to accommodate and access its entries more efficiently. This method
* is called automatically when the number of keys in the hashtable exceeds
* this hashtable's capacity and load factor.
*/
protected void rehash() {
int oldCapacity = table.length;
Entry[] oldMap = table;
int newCapacity = oldCapacity * 2 + 1;
Entry[] newMap = new Entry[newCapacity];
modCount++;
threshold = (int)(newCapacity * loadFactor);
table = newMap;
for (int i = oldCapacity ; i-- > 0 ;) {
for (Entry<K,V> old = oldMap[i] ; old != null ; ) {
Entry<K,V> e = old;
old = old.next;
int index = (e.hash & 0x7FFFFFFF) % newCapacity;
e.next = newMap[index];
newMap[index] = e;
}
}
}
Ebből is látszik, hogy a tábla kapacitásának növekedésével az ütközések valószínűsége csökken. Továbbá a rehash algoritmus időigényes és futási ideje arányoson nő az elemek számának növekedésével, ezért célszerű elkerülni a futását. Valamint fontos tudnunk, hogy az elemek törlése (remove) esetén a kapacitás nem fog csökkenni korábbi értékére.
Összefoglalva néhány tanács a Java Hashtable használatához:
- jó hash algoritmussal csökkenthető az ütközések valószínűsége; ezért akár saját hatékony hashCode() függvényt is implementálhatunk
- megfelelő kapacitást és telítettségi faktort válasszunk, hogy minél kevesebbszer fusson a rehash algoritmus, de ne foglaljunk feleslegesen memóriát túl nagy, felesleges értékek beállításával
- a kapacitás mindig legalább 25%-kal nagyobb legyen a maximálisan tárolásra kerülő elemek számánál. Megfordítva: a tábla telítettsége ne haladja meg a 75%-ot. Ez az érték optimális elérést és megfelelő méretet jelent.
Tehát a Java Hashtable egy kényelmes adatszerkezet, amely könnyen használható és rugalmas. Nagy táblák tárolására azonban csak korlátozottan használható. Pontos tervezést és odafigyelést igényel használata ezekben az esetekben.