Quelle est la différence entre eux? je le sais
Un LinkedHashSet est une version ordonnée de HashSet qui maintient une liste doublement liée à travers tous les éléments. Utilisez cette classe au lieu de HashSet lorsque vous vous souciez de l'ordre d'itération. Lorsque vous parcourez un HashSet, l'ordre est imprévisible, tandis qu'un LinkedHashSet vous permet de parcourir les éléments dans l'ordre dans lequel ils ont été insérés.
Mais dans le code source de LinkedHashSet, il n'y a que des constructeurs appelants de HashSet. Alors, où sont la liste à double lien et l'ordre d'insertion?
java
hashset
linkedhashset
Shikarn-O
la source
la source
Réponses:
La réponse se trouve dans ce qui constructeurs les
LinkedHashSet
usages pour construire la classe de base:Et (un exemple de) un
HashSet
constructeur qui prend un argument booléen est décrit et ressemble à ceci:la source
LinkedHashSet
Les constructeurs de invoquent le constructeur de classe de base suivant:Comme vous pouvez le voir, la carte interne est un fichier
LinkedHashMap
. Si vous regardez à l'intérieurLinkedHashMap
, vous découvrirez le champ suivant:Il s'agit de la liste chaînée en question.
la source
HashSet est un ensemble non ordonné et non trié .
LinkedHashSet est la version commandée de HashSet.
La seule différence entre HashSet et LinkedHashSet est que:
LinkedHashSet gère l'ordre d'insertion.
Lorsque nous parcourons un HashSet , l'ordre est imprévisible alors qu'il est prévisible dans le cas de LinkedHashSet .
La raison pour laquelle LinkedHashSet maintient l'ordre d'insertion est la suivante:
La structure de données utilisée sous-jacente est Double-Linked-List .
la source
Vous devriez regarder la source du
HashSet
constructeur qu'il appelle ... c'est un constructeur spécial qui fait du supportMap
unLinkedHashMap
au lieu de juste unHashMap
.la source
Je vous suggère d'utiliser la
LinkedHashSet
plupart du temps, car il a globalement de meilleures performances ):HashMap
, car la plupart du temps, nous utilisons des structures Set pour les itérations.Vous pouvez voir la page de test source ici: L'exemple final de test de performance
la source
HashSet: Non ordonné en fait. si u passant le paramètre signifie
Out Put: Peut-être
2,1,3
pas prévisible. la prochaine fois une autre commande.LinkedHashSet()
qui produisent l'ordre FIFO.la source
HashSet
ne pas conserver l'ordre de l'élément d'insertionLinkedHashSet
maintenir l'ordre de l'élément d'insertionExemple
HashSet
productionLinkedHashSet
productionla source
HashSet:
La structure de données soulignée est Hashtable. Les objets en double ne sont pas autorisés.L'ordre d'insertion n'est pas conservé et il est basé sur le code de hachage des objets. Une insertion nulle est possible (une seule fois). Il implémente l'interface Serializable, Clonable mais pas RandomAccess. HashSet est le meilleur choix si une opération fréquente est une opération de recherche.
Constructeurs:
LinkedHashSet:
C'est une classe enfant de HashSet. c'est exactement la même chose que HashSet, y compris (Constructeurs et Méthodes) à l'exception des différences suivantes.
Différences HashSet:
LinkedHashSet:
la source
Si vous regardez les constructeurs appelés à partir de la
LinkedHashSet
classe, vous verrez qu'en interne c'est unLinkedHashMap
qui est utilisé à des fins de sauvegarde.la source
Toutes les méthodes et tous les constructeurs sont identiques, mais une seule différence est que LinkedHashset conservera l'ordre d'insertion mais n'autorisera pas les doublons.
Hashset ne conservera aucun ordre d'insertion. C'est une combinaison de List et Set simple :)
la source