Heim >Java >javaLernprogramm >Analyse des Unterschieds zwischen Hashtable und HashMap in Java
Analyse des Unterschieds zwischen Hashtable und HashMap in Java.
1. Hashtable ist eine Unterklasse von Dictionary folgt:
Der Code lautet wie folgt:
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable HashMap:
HashMap und Hashtable sind beide Implementierungsklassen der Map-Schnittstelle
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable2 sind synchron (), während die Methoden in HashMap-Methoden standardmäßig nicht synchron sind. Das heißt, in Multithread-Anwendungen kann Hashtable sicher verwendet werden, ohne dass spezielle Vorgänge erforderlich sind. Für HashMap ist ein zusätzlicher Synchronisierungsmechanismus erforderlich. Das Synchronisationsproblem von HashMap kann jedoch durch eine statische Sammlungsmethode gelöst werden:
Der Code lautet wie folgt:
Diese Methode gibt eine synchronisierte Map zurück, d. h Sagen wir, die zurückgegebene Map ist threadsicher. Es ist zu beachten, dass Sie beim Iterieren der zurückgegebenen Karte die zurückgegebene Karte manuell synchronisieren müssen, da dies sonst zu unsicherem Verhalten führt:
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
Der Code lautet wie folgt:
3. In HashMap kann null als Schlüssel verwendet werden, und es kann nur einen solchen Schlüssel geben, dessen entsprechender Wert null ist. Wenn die Methode get() einen Nullwert zurückgibt, kann dies bedeuten, dass der Schlüssel nicht in der HashMap vorhanden ist, oder es kann auch bedeuten, dass der dem Schlüssel entsprechende Wert null ist. Daher kann in HashMap die Methode get () nicht verwendet werden, um zu bestimmen, ob ein bestimmter Schlüssel in HashMap vorhanden ist. Zur Bestimmung sollte jedoch die Methode containsKey () verwendet werden. Der Schlüsselwert von Hashtable darf nicht null sein, andernfalls: java.lang.NullPointerException.
4.HashTable verwendet Enumeration und HashMap verwendet Iterator.Map m = Collections.synchronizedMap(new HashMap()); ... Set s = m.keySet(); // Needn't be in synchronized block ... synchronized(m) { // Synchronizing on m, not s! Iterator i = s.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }Bei den oben genannten Unterschieden handelt es sich nur um oberflächliche Unterschiede, und auch ihre Implementierungen sind sehr unterschiedlich.
5. Die Standardgröße des Hash-Arrays in HashTable beträgt 11 und die Erhöhungsmethode ist alt*2+1. Die Standardgröße des Hash-Arrays in HashMap beträgt 16 und muss ein Exponent von 2 sein.
6. Die Verwendung von Hash-Werten ist unterschiedlich. Der Code lautet wie folgt:
Und HashMap berechnet den Hash-Wert neu und verwendet AND anstelle von Modulo, beispielsweise die Put-Methode von HashMap:
int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length;Der Der Code lautet wie folgt:
Der Code lautet wie folgt:
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> 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++; addEntry(hash, key, value, i); return null; }
Das obige ist der detaillierte Inhalt vonAnalyse des Unterschieds zwischen Hashtable und HashMap in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!