web-dev-qa-db-fra.com

Hashtable, HashMap, HashSet, concept de table de hachage dans un cadre de collection Java

J'apprends Java Collection Framework et j'ai une compréhension modérée. Maintenant, quand je vais un peu plus loin, j'ai quelques doutes: HashMap, HashSet, Hashtable.

La Javadoc pour HashMap dit:

Implémentation basée sur la table de hachage de l'interface Map. Ce l'implémentation fournit toutes les opérations de carte facultatives, et autorise les valeurs nulles et la clé nulle.

La Javadoc pour HashSet dit:

Cette classe implémente l'interface Set, adossée à une table de hachage (en fait une instance de HashMap). Il ne fait aucune garantie quant au ordre d'itération de l'ensemble; en particulier, cela ne garantit pas que l'ordre restera constant dans le temps.

La Javadoc pour Hashtable dit:

Cette classe implémente une table de hachage, qui mappe les clés aux valeurs. Tout Un objet non nul peut être utilisé comme clé ou comme valeur.

Il est déroutant que tous implémentent le hash table. Est-ce qu'ils implémentent le concept de table de hachage?

Il semble que tout cela soit lié les uns aux autres, mais je ne suis pas en mesure de bien le comprendre.

Quelqu'un peut-il m'aider à comprendre ce concept dans un langage simple?.

6
CuriousMind

Les interfaces Set et Map de Java spécifient deux types de collection très différents. Map est, conceptuellement, exactement ce que cela ressemble à: un mappage d'un ensemble d'objets (les clés) à un autre ensemble (les valeurs). Une Set est aussi ce que cela ressemble: une collection d'objets (sans autre structure). Hashtable et HashMap implémentent tous les Map, HashSet implémentent Set et utilisent tous des codes de hachage pour les clés/objets contenus dans les collections afin d'améliorer les performances.

Hashtable ET HashMap

Hashtable est une classe héritée qui devrait presque toujours être évitée en faveur de HashMap. Ils font essentiellement la même chose, sauf que la plupart des méthodes de Hashtable sont synchronisées, ce qui rend les appels de méthode individuels thread-safe.1 Si vous utilisez plusieurs threads et HashMap, vous devez fournir votre propre mécanisme de sécurité de synchronisation ou un autre mécanisme de sécurité des threads. 

Le problème avec Hashtable est que la synchronisation de chaque appel de méthode (opération non négligeable) est généralement une mauvaise chose. Soit vous n'avez pas du tout besoin de synchronisation ou, du point de vue de la logique d'application, vous devez synchroniser des transactions couvrant plusieurs appels de méthode. Puisqu'il était impossible de supprimer simplement la synchronisation au niveau de la méthode de Hashtable sans rompre le code existant, les auteurs de l'infrastructure Collections devaient créer une nouvelle classe. donc HashMap. C'est aussi un meilleur nom, car il devient clair que c'est une sorte de Map.

Oh, si vous avez besoin d'une synchronisation au niveau de la méthode, vous ne devriez toujours pas utiliser Hashtable. Au lieu de cela, vous pouvez appeler Collections.synchronizedMap() pour transformer n'importe quelle carte en une carte synchronisée. Vous pouvez également utiliser ConcurrentHashMap, qui, selon the docs : "obéit aux mêmes spécifications fonctionnelles que Hashtable", mais offre de meilleures performances et des fonctionnalités supplémentaires (telles que putIfAbsent()).

1À mon avis, il existe d’autres différences (moins significatives) telles que HashMap supportant null valeurs et clés.

HashSet

En termes de fonctionnalités, HashSet n'a rien à voir avec HashMap. Il arrive d'utiliser HashMap en interne pour implémenter la fonctionnalité Set. Pour une raison quelconque, les développeurs de l'infrastructure Collections ont pensé qu'il serait judicieux d'intégrer ces détails d'implémentation interne à la spécification publique de la classe. (À mon avis, c'était une erreur.)

14
Ted Hopp

Hashtable était une ancienne classe créée avant les génériques de Java. C'est seulement autour de toujours pour la compatibilité ascendante. Utilisez HashMap à la place.

Utilisez HashSet lorsque vous n'avez pas besoin de mapper des clés sur des valeurs. Il est construit sur le même algorithme que les tables de hachage, mais il est utilisé dans un but fondamentalement différent.

2
Beefster

HashMap et HashTable héritent tous les deux de Map interface.and ont presque le même fonctionnement et les mêmes propriétés.Mais les principales différences sont les suivantes: -

1.Hashmap est une mappe non ordonnée de paires clé/valeur.Et nous pouvons également avoir les paires clé/valeur nulles dans une table de hachage. De plus, une table de hachage n'est pas synchronisée (c.-à-d. Que plusieurs threads non sécurisés pour les threads peuvent y accéder et le modifier simultanément). Mais nous pouvons créer à l’extérieur un hashmap thread-safe.Si nous n’envisageons pas les problèmes de synchronisation, alors hashmap est préférable.

2.HashTable: - Une table de hachage synchronisée (c'est-à-dire une table de hachage sécurisée pour les threads) .Mais les paires clé/valeur dans ce cas ne sont jamais nulles. Dans une table de hachage, nous spécifions un objet utilisé comme clé et la valeur que nous voulons. associer à cette clé. La clé est ensuite hachée et le code de hachage résultant est utilisé comme index auquel la valeur est stockée dans la table.

3.HashSet: -Un hashset hérite d'une interface définie et à la fin il est également basé sur hashtable (ou nous pouvons dire profondément connecté à notre hashmap uniquement) mais dans ce cas, les paires clé et valeurs sont toujours uniques. Aucune valeur en double autorisée. But null les valeurs clés sont autorisées. Les objets sont insérés en fonction de leur code de hachage.

En conclusion, nous pouvons dire que les trois collections sont toutes connectées à l’interface Map.

1
P.sharma