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:
Le code est le suivant :
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
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)
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'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()); }
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;
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; }
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); }
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!