web-dev-qa-db-fra.com

quand utiliser Set vs. Collection?

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 Sets mais pas Collections?)

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.

  1. concevoir une méthode qui accepte un argument de 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.)
  2. concevoir une méthode qui renvoie un 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.)
  3. la conception d'une classe qui implémente l'interface 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.
  4. concevoir une interface qui étend l'interface Set ou Collection. Très similaire à # 3.
  5. écrire du code qui utilise un 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.
42
Jason S

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.

44
Michael Myers

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 .

8
George Armhold

Voir Java's Collection tutorial pour une bonne présentation de l'utilisation de Collection. En particulier, consultez la hiérarchie des classes.

3
Zack Marrapese

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).

3
pkaeding

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.

3
Clint Miller

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.

1
Tom

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.

1

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.

0
Peter Lawrey