La comparaison de HashMap et Hashtable est une question courante dans les entretiens Java. Elle est utilisée pour tester si les programmeurs peuvent utiliser correctement les classes de collection et s'ils peuvent utiliser une variété d'idées pour résoudre des problèmes en fonction des circonstances. Le principe de fonctionnement de HashMap, la comparaison entre ArrayList et Vector et cette question sont les questions les plus classiques sur le framework de collection Java. Hashtable est une classe de collection obsolète qui existe depuis longtemps dans l'API Java. Il a été réécrit en Java 4 et implémenté l'interface Map, il fait donc désormais partie du framework de collection Java. Hashtable et HashMap sont assez faciles à poser dans les entretiens Java et sont même devenus les questions les plus fréquemment posées dans les questions d'entretien du cadre de collecte, alors n'oubliez pas de vous préparer à cette question avant de participer à un entretien Java.
Dans cet article, nous verrons non seulement la différence entre HashMap et Hashtable, mais aussi les similitudes entre eux.
La différence entre HashMap et Hashtable
HashMap et Hashtable implémentent tous deux l'interface Map, mais avant de décider laquelle utiliser, vous devez d'abord comprendre la différence entre eux. Les principales différences sont : la sécurité des threads, la synchronisation et la vitesse.
HashMap est presque équivalent à Hashtable, sauf que HashMap n'est pas synchronisé et peut accepter null (HashMap peut accepter des clés et des valeurs nulles, mais pas Hashtable).
HashMap n'est pas synchronisé, tandis que Hashtable est synchronisé, ce qui signifie que Hashtable est thread-safe et que plusieurs threads peuvent partager une Hashtable ; sans synchronisation correcte, plusieurs threads ne peuvent pas partager HashMap. Java 5 fournit ConcurrentHashMap, qui remplace HashTable et offre une meilleure évolutivité que HashTable.
Une autre différence est que l'itérateur de HashMap (Iterator) est un itérateur à échec rapide, tandis que l'itérateur énumérateur de Hashtable n'est pas à échec rapide. Ainsi, lorsque d'autres threads modifient la structure du HashMap (ajoutent ou suppriment des éléments), une ConcurrentModificationException sera levée, mais la méthode remove() de l'itérateur lui-même ne lancera pas de ConcurrentModificationException lors de la suppression d'éléments. Mais ce n'est pas un comportement garanti, cela dépend de la JVM. C'est aussi la différence entre Enumeration et Iterator.
Étant donné que Hashtable est thread-safe et synchronisé, il est plus lent que HashMap dans un environnement monothread. Si vous n'avez pas besoin de synchronisation et n'avez besoin que d'un seul thread, l'utilisation de HashMap fonctionnera mieux que Hashtable.
HashMap ne peut pas garantir que l'ordre des éléments dans la carte restera inchangé au fil du temps.
Quelques termes importants à noter :
1) synchronisé signifie qu'un seul thread peut modifier la table de hachage à la fois. C'est-à-dire que tout thread souhaitant mettre à jour la table de hachage doit d'abord obtenir le verrou de synchronisation, et les autres threads doivent attendre que le verrou de synchronisation soit libéré avant de pouvoir obtenir à nouveau le verrou de synchronisation et mettre à jour la table de hachage.
2) La sécurité intégrée est liée à l'itérateur. Si un objet de collection crée un Iterator ou un ListIterator, et que d'autres threads tentent de modifier « structurellement » l'objet de collection, une ConcurrentModificationException sera levée. Cependant, il est permis que d'autres threads puissent modifier l'objet de collection via la méthode set(), car cela ne modifie pas « structurellement » la collection. Mais si la structure a été modifiée et que la méthode set() est à nouveau appelée, une IllegalArgumentException sera levée.
3) Les changements structurels font référence à la suppression ou à l'insertion d'un élément, ce qui affectera la structure de la carte.
Pouvons-nous synchroniser HashMap ?
HashMap peut être synchronisé via l'instruction suivante :
Map m = Collections.synchronizeMap(hashMap);
Conclusion
Il existe plusieurs différences majeures entre Hashtable et HashMap : Sécurité et rapidité du fil. N'utilisez Hashtable que si vous avez besoin d'une sécurité totale des threads, et si vous utilisez Java 5 ou supérieur, utilisez ConcurrentHashMap.
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!