web-dev-qa-db-fra.com

Quelle est la différence entre HashSet et Set?

Vu l'extrait de code comme 

Set<Record> instances = new HashSet<Record>();

Je me demande si Hashset est un type spécial de jeu. Une différence entre eux?

59
user496949

Une Set représente un "ensemble de valeurs" générique. Une TreeSet est un ensemble où les éléments sont triés (et donc classés), une HashSet est un ensemble où les éléments sont non triés ou ordonnés.

Un HashSet est généralement beaucoup plus rapide qu'un TreeSet.

TreeSet est généralement implémenté sous la forme d'un arbre rouge-noir (voir http://en.wikipedia.org/wiki/Red-black_tree - Je n'ai pas validé la mise en œuvre réelle de la variable TreeSet de Sun/Oracle), alors qu'un HashSet utilise Object.hashCode() pour créer un index dans un tableau. Le temps d'accès pour un arbre rouge-noir est O(log(n)) alors que le temps d'accès pour une HashSet va de l'heure constante au pire des cas (chaque élément a le même hashCode) où vous pouvez avoir une heure de recherche linéaire O(n).

75
Erik

HashSet est une implémentation de Set .

31
vaugham

La question a été répondue, mais je n'ai pas vu la réponse à la raison pour laquelle le code mentionne les deux types dans le même code.

En règle générale, vous souhaitez coder des interfaces qui, dans ce cas, sont définies. Pourquoi? Parce que si vous référencez toujours votre objet par le biais d'interfaces (à l'exception du nouveau HashSet ()), il est alors trivial de modifier son implémentation ultérieurement si vous estimez qu'il serait préférable de le faire car vous ne l'avez mentionné qu'une fois dans votre code base (où vous avez créé le nouveau HashSet ()). 

14
MeBigFatGuy

Set est l'interface générale d'une collection, alors que HashSet est une implémentation spécifique de l'interface Set (qui utilise des codes de hachage, d'où son nom).

8
gmw

Set est une collection qui ne contient aucun élément en double. Set est une interface. 

HashSet implémente l'interface Set, sauvegardée par une table de hachage (en réalité une instance HashMap). 

Puisque HashSet est l’une des implémentations spécifiques de l’interface Set

ASet peut être l’un des suivants puisqu'il a été implémenté par les classes ci-dessous

ConcurrentSkipListSet : Une implémentation simultanée évolutive de NavigableSet basée sur ConcurrentSkipListMap. Les éléments de l'ensemble sont conservés triés selon leur ordre naturel ou selon une variable Comparator fournie au moment de la création de l'ensemble, en fonction du constructeur utilisé.

CopyOnWriteArraySet : Un ensemble qui utilise une CopyOnWriteArrayList interne pour toutes ses opérations. 

EnumSet : Une implémentation Set spécialisée à utiliser avec les types enum. Tous les éléments d'un ensemble d'énumérations doivent provenir d'un seul type d'énum spécifié, explicitement ou implicitement, lors de la création de l'ensemble.

TreeSet : Une implémentation de NavigableSet basée sur une TreeMap. Les éléments sont classés en utilisant leur ordre naturel ou à l'aide d'un comparateur fourni au moment de la création, en fonction du constructeur utilisé.

LinkedHashSet : implémentation de la table ash et de la liste liée de l'interface Set, avec un ordre d'itération prévisible. Cette implémentation diffère de HashSet en ce sens qu'elle gère une liste à double liaison traversant toutes ses entrées. 

Mais HashSet ne peut être que LinkedHashSet puisque LinkedHashSet sous-classes HashSet

3
Ravindra babu

Set est une interface parente de toutes les classes définies telles que TreeSet, LinkedHashSet, etc. 

HashSet est une classe implémentant l'interface Set.

2
u449355

HashSet est une classe dérivée de l'interface Set. En tant que classe dérivée de Set, HashSet atteint les propriétés de Set. Les classes dérivées de Set importantes et les plus fréquemment utilisées sont HashSet et TreeSet.

0
Hemlata Gehlot

**

  • Ensemble:

** C'est une interface qui est un sous-type de l'interface Collection, tout comme LIST et QUEUE.

Set a moins de 3 sous-classes, il est utilisé pour stocker plusieurs objets sans doublons.

  1. HashSet
  2. LinkedHashSet
  3. TreeSet (qui implémente l'interface SortedSet)

**

  • HashSet:

**

Peut utiliser une valeur NULL (car la duplication n'est pas autorisée), les données sont stockées de manière aléatoire car elles ne conservent pas la séquence.

0
Anonymous User