Maison  >  Article  >  Java  >  La différence entre HashMap, Hashtable et HashSet en Java

La différence entre HashMap, Hashtable et HashSet en Java

高洛峰
高洛峰original
2017-01-19 10:26:531729parcourir

Classe Hashtable
Hashtable hérite de l'interface Map et implémente une table de hachage de mappage clé-valeur. Tout objet non nul peut être utilisé comme clé ou valeur.

Pour ajouter des données, utilisez put(key,value), et pour supprimer des données, utilisez get(key). Le coût en temps de ces deux opérations de base est constant. ​

Hashtable ajuste les performances via deux paramètres : la capacité initiale et le facteur de charge. Habituellement, le facteur de charge par défaut de 0,75 permet d'obtenir un meilleur équilibre entre le temps et l'espace. L'augmentation du facteur de charge peut économiser de l'espace, mais le temps de recherche correspondant augmentera, ce qui affectera les opérations telles que l'extraction et la mise en place.

Un exemple simple d'utilisation de Hashtable est le suivant. Mettez 1, 2 et 3 dans Hashtable, et leurs clés sont respectivement "un", "deux" et "trois" :
Numéros de table de hachage = new Hashtable( );
numbers.put("un", new Integer(1));
numbers.put("deux", new Integer(2)); ”, new Integer(3));

Pour récupérer un nombre, tel que 2, utilisez la clé correspondante :

Integer n = (Integer)numbers.get(« two »); System.out.println("two = " n);

Puisque l'objet en tant que clé déterminera la position de la valeur correspondante en calculant sa fonction de hachage, tout objet en tant que clé doit implémenter le hashCode et est égal à méthodes. Les méthodes hashCode et equals héritent de la classe racine Object. Si vous utilisez une classe personnalisée comme clé, soyez très prudent Selon la définition de la fonction de hachage, si les deux objets sont identiques, c'est-à-dire obj1.equals(. obj2)=true, alors leur hashCode doit être le même, mais si deux objets sont différents, leur hashCode n'est pas nécessairement différent. Si le hashCode de deux objets différents est le même, ce phénomène est appelé conflit. le temps nécessaire à l'exploitation de la table de hachage augmente. Par conséquent, essayez de définir une méthode hashCode() bien définie pour accélérer les opérations de la table de hachage.

Si le même objet a un hashCode différent, le fonctionnement de la table de hachage aura des résultats inattendus (la méthode get attendue renvoie null. Pour éviter ce problème, vous n'avez qu'à vous rappeler d'une chose : copier en même temps). time est égal à la méthode et à la méthode hashCode, au lieu de simplement en écrire une. La table de hachage est synchrone.

Classe HashMap
HashMap est similaire à Hashtable, sauf que HashMap est asynchrone et autorise null, c'est-à-dire une valeur nulle et une clé nulle. , mais lorsque l'on traite HashMap comme une collection (la méthode values() peut renvoyer une collection), la surcharge temporelle de ses sous-opérations d'itération est proportionnelle à la capacité du HashMap. Par conséquent, si les performances des opérations itératives sont très importantes, ne définissez pas la capacité initiale de HashMap trop élevée ni le facteur de charge trop bas.

Classe WeakHashMap
WeakHashMap est un HashMap amélioré, qui implémente des « références faibles » aux clés Si une clé n'est plus référencée en externe, la clé peut être recyclée par GC.

HashSet veuillez vous référer à la description de Set

Set est une collection qui ne contient pas d'éléments répétés, c'est-à-dire que deux éléments e1 et e2 ont e1.equals(e2)=false, Set a le most Il y a un élément nul.


Le constructeur de Set a une contrainte selon laquelle le paramètre Collection transmis ne peut pas contenir d'éléments en double. ​

Veuillez noter : les objets mutables doivent être manipulés avec soin. Si un élément mutable dans un Set change d'état, provoquant Object.equals(Object)=true, cela entraînera des problèmes.

Deux implémentations Set courantes sont HashSet et TreeSet. Décider lequel utiliser est assez simple. HashSet est beaucoup plus rapide (temps constant par rapport au temps de journalisation pour la plupart des opérations), mais ne fournit pas de garanties de commande. Si vous devez utiliser les opérations dans un SortedSet ou si l'itération séquentielle est importante pour vous, utilisez un TreeSet. Sinon, utilisez HashSet. C'est un pari raisonnable pour vous de ne pas utiliser de HashSet la plupart du temps.​  

Une chose que vous devez garder à l'esprit à propos de HashSet est que l'itération est linéaire en termes de somme du nombre d'entrées et de la capacité. Par conséquent, si les performances itératives sont importantes, une capacité initiale appropriée doit être choisie avec soin. Choisir une capacité trop grande gaspille à la fois de l’espace et du temps. La capacité initiale par défaut est de 101, ce qui est généralement supérieur à ce dont vous avez besoin. La capacité initiale peut être spécifiée à l'aide du constructeur int. La capacité initiale du HashSet à allouer est de 17 :

Set s= new HashSet(17);

Les HashSets ont également un "paramètre de réglage" appelé facteur de charge " . Si vous êtes très préoccupé par l'utilisation de l'espace de votre HashSet, lisez le texte du HashSet pour plus de détails. Sinon, utilisez simplement la valeur par défaut. Si vous acceptez le facteur de charge par défaut, mais que vous souhaitez spécifier une capacité initiale, choisissez un nombre qui est environ le double de la capacité à laquelle vous prévoyez que votre ensemble grandisse. Si votre estimation est erronée, elle peut s'agrandir ou simplement perdre un peu d'espace. Mais il n'y a pas de gros problèmes. Si vous connaissez la meilleure valeur pour la taille correcte, utilisez-la ; si vous ne la connaissez pas, utilisez une ancienne valeur ou utilisez une valeur paire. Ce n'est vraiment pas très important. Ces choses ne font que rendre HashSet légèrement meilleur.                                 

TreeSet n'a aucun paramètre d'ajustement. En plus du clonage, HashSet et TreeSet n'ont que les opérations requises par leurs interfaces respectives (Set et TreeSet), et aucune autre opération.


Pour plus d'articles sur les différences entre 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