2009-05-04 19 views
33

Esiste qualche differenza pratica tra uno Set e Collection in Java, oltre al fatto che uno Collection può includere lo stesso elemento due volte? Hanno gli stessi metodi.quando usare Set vs. Collection?

(ad esempio, fa Set mi danno più opzioni per utilizzare le librerie che accettano Set s, ma non Collection s?)

edit: mi viene in mente almeno 5 diverse situazioni per giudicare questa domanda. Qualcun altro può venire di più? Voglio assicurarmi di capire le sottigliezze qui.

  1. progettazione di un metodo che accetta un argomento di Set o Collection. Collection è più generale e accetta più possibilità di input. (se sto progettando una classe specifica o un'interfaccia, sono più gentile con i miei consumatori e più severo sui sottoclassi/implementatori se utilizzo Collection.)
  2. progettando un metodo che restituisce un Set o Collection. Set offre più garanzie di Collection (anche se è solo la garanzia di non includere un elemento due volte). (se sto progettando una classe specifica o un'interfaccia, sono più gentile con i miei consumatori e più severo sui sottoclassi/implementatori se utilizzo Set.)
  3. progettando una classe che implementa l'interfaccia Set o Collection. Problemi simili al n. 2. Gli utenti della mia classe/interfaccia ottengono maggiori garanzie, sottoclassi/implementatori hanno più responsabilità.
  4. progettazione di un'interfaccia che estende l'interfaccia Set o Collection. Molto simile al # 3.
  5. codice di scrittura che utilizza uno Set o Collection. Qui potrei anche usare Set; l'unica ragione per me per usare Collection è se torno un Collection dal codice di qualcun altro, o se devo gestire una raccolta che contiene duplicati.
+1

buona domanda ma imho scarse risposte – Kemoda

risposta

37

Collection è anche il supertipo di List, Queue, Deque, e altri, in modo che vi dà più opzioni. Ad esempio, provo a utilizzare Collection come parametro per i metodi di libreria che non dovrebbero dipendere esplicitamente da un determinato tipo di raccolta.

In genere, è necessario utilizzare lo strumento giusto per il lavoro. Se non si desidera duplicare, utilizzare Set (o SortedSet se si desidera ordinare oppure LinkedHashSet se si desidera mantenere l'ordine di inserimento). Se si desidera consentire duplicati, utilizzare List e così via.

+1

In che modo utilizzare una raccolta ti offre * più * opzioni? L'uso di cose più generali di solito ti dà * meno * potere. – Martijn

+5

Fornisce più opzioni alla persona che chiama un metodo che accetta una raccolta come parametro perché può passare un elenco, un set o una coda senza dover effettuare alcuna conversione. –

+4

Sì, stavo parlando dal punto di vista della persona che scrive un metodo accettando una collezione. Per un metodo * restituendo * qualcosa, preferisco usare il tipo appropriato per il lavoro, come ho detto. –

3

Vedere Java Collection tutorial per un buon utilizzo dell'utilizzo della raccolta. In particolare, controlla la gerarchia delle classi.

8

Penso che tu abbia già capito: usa un Set quando vuoi escludere in modo specifico i duplicati. Collection è in genere il minimo comune denominatore ed è utile specificare API che accettano/restituiscono ciò, lasciando spazio per modificare i dettagli in un secondo momento, se necessario. Tuttavia, se i dettagli della tua applicazione richiedono voci univoche, utilizzare Set per far rispettare questo.

Inoltre vale la pena considerare se l'ordine è importante per voi; se lo è, usa List o LinkedHashSet se ti interessa l'unicità dell'ordine e.

+0

L'API dovrebbe in genere restituire un tipo più specifico quindi 'Raccolta'. Ad esempio se è possibile restituire un 'Elenco', quindi farlo. Solo se non sei sicuro del tipo di ritorno, potresti prendere in considerazione la restituzione di 'Collection'. – Flow

1

È necessario utilizzare un set quando è ciò che si desidera.

Ad esempio, un elenco senza alcun ordine o duplicati. Metodi come contiene sono abbastanza utili.

Una raccolta è molto più generica. Credo che ciò che i mmyer hanno scritto sul loro uso dice tutto.

2

Come afferma @mmyers, Collection include Set e List.

Quando dichiari qualcosa come un Set, piuttosto che una Collezione, stai dicendo che la variabile non può essere una Lista o una Mappa. Sarà sempre una collezione, però. Quindi, qualsiasi funzione che accetti una Collezione accetterà un Set, ma una funzione che accetta un Set non può prendere una Collezione (a meno che non la lanci su un Set).

+0

In realtà, la mappa non estende la raccolta. –

+0

Hai ragione, mio ​​errore. Ho appena modificato la risposta per risolvere questo problema. – pkaeding

1

La differenza pratica è che Imposta applica la logica impostata su, vale a dire senza duplicati e non ordinata, mentre Raccolta non lo fa. Quindi se hai bisogno di una Collezione e non hai particolari requisiti per evitare duplicati, usa una Collezione. Se hai i requisiti per Set, usa Set. Generalmente usa l'interfaccia più alta possibile.

2

Un'altra cosa da considerare ... Gli insiemi hanno un sovraccarico extra nel tempo, nella memoria e nella codifica per garantire che non vi siano duplicati. (Tempo e memoria perché gli insiemi sono solitamente supportati da una HashMap o da un albero, che aggiunge un sovraccarico su un elenco o un array. Codifica perché devi implementare i metodi hashCode() ed equals())

Io di solito uso imposta quando ho bisogno di un'implementazione veloce di contains() e uso la raccolta o l'elenco in caso contrario, anche se la raccolta non dovrebbe avere duplicati.

0

As Collection è un tipo super di Set e SortedSet che può essere passato a un metodo che si aspetta una Collection. Raccolta significa solo che può o non può essere ordinato, ordinare o consentire duplicati.

Problemi correlati