Heim > Java > javaLernprogramm > Analyse des Unterschieds zwischen Hashtable und HashMap in Java

Analyse des Unterschieds zwischen Hashtable und HashMap in Java

巴扎黑
Freigeben: 2017-05-21 14:22:24
Original
1512 Leute haben es durchsucht

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:
Nach dem Login kopieren

HashMap und Hashtable sind beide Implementierungsklassen der Map-Schnittstelle

public class HashMap<K,V>
    extends AbstractMap<K,V>
     implements Map<K,V>, Cloneable, Serializable
Nach dem Login kopieren
2 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)
Nach dem Login kopieren

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&#39;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());
   }
Nach dem Login kopieren
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:

Der Code lautet wie folgt:

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
Nach dem Login kopieren
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;
     }
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage