Existe-t-il une différence pratique entre un Set
et Collection
en Java, outre le fait qu'un Collection
peut inclure deux fois le même élément? Ils ont les mêmes méthodes.
(Par exemple, Set
me donne-t-il plus d'options pour utiliser des bibliothèques qui acceptent Set
s mais pas Collection
s?)
edit: Je peux penser à au moins 5 situations différentes pour juger cette question. Quelqu'un d'autre peut-il en proposer plus? Je veux m'assurer de bien comprendre les subtilités ici.
Set
ou Collection
. Collection
est plus général et accepte plus de possibilités de saisie. (si je conçois une classe ou une interface spécifique, je suis plus gentil avec mes consommateurs et plus strict avec mes sous-classes/implémenteurs si j'utilise Collection
.)Set
ou Collection
. Set
offre plus de garanties que Collection
(même si c'est juste la garantie de ne pas inclure un élément deux fois). (si je conçois une classe ou une interface spécifique, je suis plus gentil avec mes consommateurs et plus strict avec mes sous-classes/implémenteurs si j'utilise Set
.)Set
ou Collection
. Problèmes similaires au n ° 2. Les utilisateurs de ma classe/interface obtiennent plus de garanties, les sous-classes/implémenteurs ont plus de responsabilités.Set
ou Collection
. Très similaire à # 3.Set
ou Collection
. Ici, je pourrais aussi bien utiliser Set
; les seules raisons pour lesquelles j'utilise Collection
sont si je récupère un Collection
à partir du code de quelqu'un d'autre, ou si je dois gérer une collection qui contient des doublons.Collection
est également le sur-type de List
, Queue
, Deque
et d'autres, donc il vous donne plus d'options. Par exemple, j'essaie d'utiliser Collection
comme paramètre pour les méthodes de bibliothèque qui ne devraient pas dépendre explicitement d'un certain type de collection.
En règle générale, vous devez utiliser le bon outil pour le travail. Si vous ne voulez pas de doublons, utilisez Set
(ou SortedSet
si vous voulez commander, ou LinkedHashSet
si vous voulez maintenir l'ordre d'insertion). Si vous souhaitez autoriser les doublons, utilisez List
, etc.
Je pense que vous l'avez déjà compris - utilisez un Set
lorsque vous souhaitez exclure spécifiquement les doublons. Collection
est généralement le plus petit dénominateur commun, et il est utile de spécifier des API qui acceptent/renvoient cela, ce qui vous laisse la possibilité de modifier les détails plus tard si nécessaire. Cependant, si les détails de votre application nécessitent entrées uniques, utilisez Set
pour appliquer cela.
Il convient également de considérer si l'ordre est important pour vous; si c'est le cas, utilisez List
ou LinkedHashSet
si vous vous souciez de l'unicité de l'ordre et .
Voir Java's Collection tutorial pour une bonne présentation de l'utilisation de Collection. En particulier, consultez la hiérarchie des classes.
Comme l'indique @mmyers, Collection comprend Set, ainsi que List.
Lorsque vous déclarez quelque chose en tant qu'ensemble, plutôt qu'en tant que collection, vous dites que la variable ne peut pas être une liste ou une carte. Ce sera toujours une collection. Ainsi, toute fonction qui accepte une collection acceptera un ensemble, mais une fonction qui accepte un ensemble ne peut pas prendre une collection (à moins que vous ne la convertissiez en ensemble).
Une autre chose à considérer ... Les ensembles ont une surcharge de temps, de mémoire et de codage afin de garantir qu'il n'y a pas de doublons. (Temps et mémoire car les ensembles sont généralement soutenus par une HashMap ou une arborescence, ce qui ajoute une surcharge sur une liste ou un tableau. Codage car vous devez implémenter les méthodes hashCode () et equals ().)
J'utilise généralement des ensembles lorsque j'ai besoin d'une implémentation rapide de contains () et j'utilise Collection ou List sinon, même si la collection ne doit pas avoir de doublons.
Vous devez utiliser un ensemble lorsque c'est ce que vous voulez.
Par exemple, une liste sans ordre ni doublons. Les méthodes comme contains sont très utiles.
Une collection est beaucoup plus générique. Je crois que ce que mmyers a écrit sur leur utilisation en dit long.
La différence pratique est que Set applique la logique set, c'est-à-dire sans doublons et non ordonné, contrairement à Collection. Donc, si vous avez besoin d'une collection et que vous n'avez pas d'exigence particulière pour éviter les doublons, utilisez une collection. Si vous avez besoin de Set, utilisez Set. Utilisez généralement la plus haute interface possible.
Comme Collection est un super type de Set et SortedSet, ceux-ci peuvent être passés à une méthode qui attend une Collection. La collecte signifie simplement qu'elle peut ou non être triée, ordonner ou autoriser les doublons.