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

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

Jan 19, 2017 am 10:26 AM

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Mar 17, 2025 pm 05:35 PM

Le chargement de classe de Java implique le chargement, la liaison et l'initialisation des classes à l'aide d'un système hiérarchique avec Bootstrap, Extension et Application Classloaders. Le modèle de délégation parent garantit que les classes de base sont chargées en premier, affectant la classe de classe personnalisée LOA

Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Mar 17, 2025 pm 05:44 PM

L'article examine la mise en œuvre de la mise en cache à plusieurs niveaux en Java à l'aide de la caféine et du cache de goyave pour améliorer les performances de l'application. Il couvre les avantages de configuration, d'intégration et de performance, ainsi que la gestion de la politique de configuration et d'expulsion le meilleur PRA

Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux? Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux? Mar 17, 2025 pm 05:43 PM

L'article discute de l'utilisation de JPA pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux. Il couvre la configuration, la cartographie des entités et les meilleures pratiques pour optimiser les performances tout en mettant en évidence les pièges potentiels. [159 caractères]

Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Mar 17, 2025 pm 05:46 PM

L'article discute de l'utilisation de Maven et Gradle pour la gestion de projet Java, la construction de l'automatisation et la résolution de dépendance, en comparant leurs approches et leurs stratégies d'optimisation.

Mar 17, 2025 pm 05:45 PM

L'article discute de la création et de l'utilisation de bibliothèques Java personnalisées (fichiers JAR) avec un versioning approprié et une gestion des dépendances, à l'aide d'outils comme Maven et Gradle.

See all articles