Maison > Java > javaDidacticiel > le corps du texte

Analyse de la différence entre Hashtable et HashMap en Java

巴扎黑
Libérer: 2017-05-21 14:22:24
original
1479 Les gens l'ont consulté

Analyse de la différence entre Hashtable et HashMap en java. Les amis qui en ont besoin peuvent s'y référer

1 Hashtable est une sous-classe de Dictionary

Le code est le suivant. suit :

 public class Hashtable<K,V>
     extends Dictionary<K,V>
     implements Map<K,V>, Cloneable, java.io.Serializable 
HashMap:
Copier après la connexion

Le code est le suivant :

public class HashMap<K,V>
    extends AbstractMap<K,V>
     implements Map<K,V>, Cloneable, Serializable
Copier après la connexion

HashMap et Hashtable sont tous deux des classes d'implémentation de l'interface Map

2 Les méthodes dans Hashtable ; sont synchrones (), tandis que les méthodes des méthodes HashMap ne sont pas synchrones par défaut. Autrement dit, dans les applications multithread, Hashtable peut être utilisé en toute sécurité sans opérations spéciales ; pour HashMap, un mécanisme de synchronisation supplémentaire est requis. Mais le problème de synchronisation de HashMap peut être résolu grâce à une méthode statique de Collections :

Le code est le suivant :

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
Copier après la connexion

Cette méthode renvoie une Map synchronisée, c'est-à-dire disons, la carte renvoyée est thread-safe. A noter que lors de l'itération de la carte renvoyée, vous devez synchroniser manuellement la carte renvoyée, sinon cela entraînera un comportement incertain :

Le code est le suivant :

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());
   }
Copier après la connexion

3. Dans HashMap, null peut être utilisé comme clé, et il n'existe qu'une seule clé de ce type ; il peut y avoir une ou plusieurs clés dont la valeur correspondante est nulle ; Lorsque la méthode get() renvoie une valeur nulle, cela peut signifier que la clé n'existe pas dans le HashMap, ou cela peut également signifier que la valeur correspondant à la clé est nulle. Par conséquent, dans HashMap, la méthode get() ne peut pas être utilisée pour déterminer si une certaine clé existe dans HashMap, mais la méthode containKey() doit être utilisée pour le déterminer. La valeur clé de Hashtable ne peut pas être nulle, sinon : java.lang.NullPointerException.
4.HashTable utilise Enumeration et HashMap utilise Iterator.
Les différences ci-dessus ne sont que superficielles, et leurs mises en œuvre sont également très différentes.
5. La taille par défaut du tableau de hachage dans HashTable est de 11 et la méthode d'augmentation est ancienne*2+1. La taille par défaut du tableau de hachage dans HashMap est de 16 et doit être un exposant de 2.
6. L'utilisation des valeurs de hachage est différente. HashTable utilise directement le hashCode de l'objet :

Le code est le suivant :

<🎜. >
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
Copier après la connexion
Et HashMap recalcule la valeur de hachage, et utilise AND au lieu du module, par exemple, la méthode put de HashMap :

Le code est le suivant :

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;
     }
Copier après la connexion
Le le code est le suivant :

static int hash(int h) {
         // This function ensures that hashCodes that differ only by
         // constant multiples at each bit position have a bounded
         // number of collisions (approximately 8 at default load factor).
         h ^= (h >>> 20) ^ (h >>> 12);
         return h ^ (h >>> 7) ^ (h >>> 4);
     }
Copier après la connexion
Le code est le suivant :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!