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?
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)
.
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 ()).
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).
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
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.
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.
**
** 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.
**
**
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.