Maison  >  Article  >  Java  >  Une brève analyse des différences entre Map et HashMap, Hashtable et HashSet en Java

Une brève analyse des différences entre Map et HashMap, Hashtable et HashSet en Java

高洛峰
高洛峰original
2017-01-19 10:29:101639parcourir

La différence entre HashTable et HashMap

Premièrement, les classes parents héritées sont différentes.
Hashtable hérite de la classe Dictionary et HashMap hérite de la classe AbstractMap. Mais les deux implémentent l’interface Map.

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable


Deuxièmement, la sécurité des threads est différente.
Les méthodes de Hashtable sont synchronisées, tandis que les méthodes de HashMap ne sont pas synchronisées par défaut. Dans un environnement simultané multithread, vous pouvez utiliser Hashtable directement sans synchroniser vous-même ses méthodes. Cependant, lorsque vous utilisez HashMap, vous devez ajouter vous-même le traitement de synchronisation.


Troisièmement, faut-il fournir la méthode contain ?
HashMap a supprimé la méthode contain de Hashtable et l'a modifiée en containValue et containKey, car la méthode contain est facile à provoquer. malentendu.

Hashtable conserve trois méthodes : contain, containValue et containKey, parmi lesquelles contain et containValue ont les mêmes fonctions.

Quatrièmement, si la clé et la valeur autorisent les valeurs nulles.
La clé et la valeur sont toutes deux des objets et ne peuvent pas contenir de clés en double, mais peuvent contenir des valeurs en double.
Dans Hashtable, les valeurs nulles ne sont pas autorisées dans la clé et la valeur.
Dans HashMap, null peut être utilisé comme clé, et il n'y a 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, il se peut que la clé n'existe pas dans le HashMap, ou que la valeur correspondant à la clé soit 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.

Cinquièmement, l'implémentation interne des deux méthodes de traversée est différente.
Hashtable et HashMap utilisent tous deux Iterator. Pour des raisons historiques, Hashtable utilise également l'énumération.

Sixièmement, les valeurs de hachage sont différentes.
L'utilisation des valeurs de hachage est différente. HashTable utilise directement le hashCode de l'objet. Et HashMap recalcule la valeur de hachage.

Septièmement, l'implémentation interne utilise différentes méthodes d'initialisation et d'expansion du tableau.
La taille initiale et la méthode d'expansion des tableaux dans les deux implémentations internes de Hashtable et HashMap. La taille par défaut du tableau de hachage dans HashTable est de 11 et la méthode d'augmentation est old*2 1.

La taille par défaut du tableau de hachage dans HashMap est de 16, et il doit s'agir d'un exposant de 2.

Pour plus d'articles sur les différences entre Map et HashMap, Hashtable et HashSet en Java, veuillez faire attention au site Web PHP chinois !


Déclaration:
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