Qual è la differenza tra Set ed Elenco?


Risposte:


504

Listè una sequenza ordinata di elementi mentre Setè un elenco distinto di elementi non ordinato (grazie, Quinn Taylor ).

List<E>:

Una raccolta ordinata (nota anche come sequenza). L'utente di questa interfaccia ha un controllo preciso su dove viene inserito ciascun elemento nell'elenco. L'utente può accedere agli elementi in base al loro indice intero (posizione nell'elenco) e cercare elementi nell'elenco.

Set<E>:

Una raccolta che non contiene elementi duplicati. Più formalmente, i set non contengono coppie di elementi e1 ed e2 tali che e1.equals (e2) e al massimo un elemento null. Come implica il suo nome, questa interfaccia modella l'astrazione dell'insieme matematico.


7
Per un SortedSet, non ci sono due elementi in cui compareTo () == 0, poiché non viene chiamato equals.
Peter Lawrey,

34
È possibile ordinare un set, quindi la prima affermazione di questa risposta è fuorviante, anche se ovviamente un elenco deve essere scelto per far rispettare l'ordine di raccolta
Samuel EUSTACHI

24
SBAGLIATO! È possibile ordinare un set Java, a seconda dell'implementazione; ad esempio, viene ordinato un Java TreeSet. Nel contesto di Java, l'unica differenza tra un elenco e un set è che il set contiene elementi unici. Nel contesto della matematica, gli elementi di un set sono unici e non ordinati.
stackoverflowuser2010

44
Sì, un Java Set PU be ESSERE MA NON è NECESSARAMENTE ordinato. Sì, se disponi di un TreeSet, puoi contare su quello ordinato. Ma devi SAPERE che hai un TreeSet e non solo un Set. Se ti viene restituito un set, non puoi dipendere da quello da ordinare. D'altra parte, un Elenco è ordinato per sua stessa natura e ogni implementazione di Elenco deve essere ordinata. Quindi, ai termini della definizione dell'interfaccia, non è particolarmente sbagliato dire che un Set non è ordinato, ma forse è un po 'più tecnicamente corretto dire che un Set non fornisce alcuna garanzia dell'ordine degli elementi.
Spanky Quigman,

14
Non confondere "ordinato" con "ordinato". Allo stesso modo, non confondere il contratto di un'interfaccia e le implementazioni dell'interfaccia. È anche sbagliato dire che qualcosa che è "non ordinato" non ha alcun ordine, significa semplicemente che non ci sono garanzie sull'esecuzione dell'ordine (e che l'ordine potrebbe non essere stabile tra le chiamate, a differenza di un elenco ordinato).
lilbyrdie,

223
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
                            List                     Set              
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
     Duplicates              YES                     NO               
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
       Order              ORDERED          DEPENDS ON IMPLEMENTATION  
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
 Positional Access          YES                      NO                
╚═══════════════════╩══════════════════════╩═════════════════════════════╝

2
Una cosa da notare: le prestazioni dell'accesso posizionale dipendono molto dall'implementazione sottostante, dall'array alla lista collegata stackoverflow.com/questions/322715/…
Christophe Roussy,

1
Come vengono indicizzati gli insiemi se non per accesso posizionale? (+1 per la tabella ASCII)
fino al

72

Elenchi di elementi ordinati (univoci o meno)
Conforme all'interfaccia Java denominataList
Accesso accessibile tramite indice

implementato usando

  • Lista collegata
  • Lista di array

Elenchi di elementi unici:
Conforme all'interfaccia di Java chiamatoSet
Può non essere accessibile da index

implementato usando

  • HashSet (non ordinato)
  • LinkedHashSet (ordinato)
  • TreeSet (ordinato per ordine naturale o per comparatore fornito)

Entrambe le interfacce Sete sono Listconformi all'interfaccia Java denominataCollection


28

Un set non può contenere elementi duplicati mentre un elenco può. Una lista (in Java) implica anche l'ordine.


16
  • Una lista è un raggruppamento ordinato di articoli
  • Un set è un raggruppamento non ordinato di elementi senza duplicati consentiti (di solito)

Concettualmente di solito ci riferiamo a un raggruppamento non ordinato che consente i duplicati come Bag e che non consente i duplicati è un set.


Un set non può avere duplicati.
karim79,

Vengono ordinate alcune implementazioni di set (come LinkedHashSet, che mantiene una LinkedList dietro le quinte). Ma il Set ADT non ha ordini.
Michael Myers

10

Elenco

  1. È un raggruppamento ordinato di elementi.
  2. Elenco viene utilizzato per la raccolta di elementi con duplicati.
  3. Nuovi metodi sono definiti nell'interfaccia Elenco.

Impostato

  1. È un raggruppamento di elementi non ordinato.
  2. Il set viene utilizzato per la raccolta di elementi senza duplicati.
  3. Nessun nuovo metodo è definito all'interno dell'interfaccia Set, quindi dobbiamo usare i metodi dell'interfaccia Collection solo con le sottoclassi Set.

10

Elenco:

Lists generalmente consente oggetti duplicati. Listgli s devono essere ordinati e sono quindi accessibili per indice.

Classi di implementazione includono: ArrayList, LinkedList,Vector

Impostato:

Sets non consentono oggetti duplicati. La maggior parte delle implementazioni non è ordinata, ma è specifica per l'implementazione.

Le classi di implementazione includono: HashSet(non ordinate), LinkedHashSet(ordinate), TreeSet(ordinate per ordine naturale o per comparatore fornito)


7

Mentre parliamo delle interfacce Java, perché non guardare Javadoc ?!

  • A Listè una raccolta ordinata (sequenza), che in genere consente duplicati
  • A Seta è una raccolta che non contiene elementi duplicati, l'ordine di iterazione può essere garantito dall'implementazione

Non si fa menzione della mancanza di ordine riguardo agli insiemi: dipende dall'implementazione.


2
Corretta. LinkedHashSet contiene elementi in ordine di inserimento.
ggb667,

È un'interfaccia, TUTTO dipende dall'implementazione. List.get () potrebbe creare un file contenente i primi 5 decimali di pi e generare StackOverFlowException in alcune implementazioni, ciò non implica che si possa dire "Un elenco è qualcosa che può creare file", dal momento che non fa parte del contratto definito dall'interfaccia. L'affermazione di documenti Set è modellata sul concetto matematico di un set, che per definizione non è ordinato. Dato un set nel tuo codice, non puoi presumere che sia ordinato senza violare i principi SOLID.
Sara

@kai, di solito tengo LinkedHashSetsul lato sinistro se il codice si basa sull'ordine in seguito. Lo uso solo Setse lo uso davvero come uno, poiché non puoi presumere che l'implementazione sottostante sia una LinkedHashSeto tale, potrebbe essere oggi, ma domani il codice cambia e fallirà.
Christophe Roussy,

Se dichiari un LinkedHashSet non hai a che fare con un Set, quindi fare affermazioni su come i Set dovrebbero comportarsi è poco rilevante. Direi che attribuire (possibile) ordine ai set in base ad alcune implementazioni è simile a dire "Le istanze di Runnable hanno un metodo di esecuzione pensato per essere eseguito su alcuni thread. Inoltre aprono una connessione DB e leggono i dati dei clienti a seconda dell'implementazione. " Naturalmente alcune implementazioni potrebbero farlo, ma non è ciò che è implicito dall'interfaccia eseguibile.
Sara

5

Questa potrebbe non essere la risposta che stai cercando, ma JavaDoc delle classi di raccolte è in realtà piuttosto descrittivo. Copia / incollato:

Una raccolta ordinata (nota anche come sequenza). L'utente di questa interfaccia ha un controllo preciso su dove viene inserito ciascun elemento nell'elenco. L'utente può accedere agli elementi in base al loro indice intero (posizione nell'elenco) e cercare elementi nell'elenco.

A differenza dei set, gli elenchi in genere consentono elementi duplicati. Più formalmente, gli elenchi in genere consentono coppie di elementi e1 ed e2 tali che e1.equals (e2) e in genere consentono più elementi null se consentono affatto elementi null. Non è inconcepibile che qualcuno potrebbe voler implementare un elenco che proibisce i duplicati, generando eccezioni di runtime quando l'utente tenta di inserirli, ma ci aspettiamo che questo utilizzo sia raro.


5

Un set è un gruppo non ordinato di oggetti distinti: non sono ammessi oggetti duplicati. In genere viene implementato utilizzando il codice hash degli oggetti da inserire. (Le implementazioni specifiche possono aggiungere ordini, ma l'interfaccia Set stessa non lo fa.)

Un elenco è un gruppo ordinato di oggetti che può contenere duplicati. Potrebbe essere implementato con una ArrayList, LinkedListe così via


1
Sono confuso 😕! Cosa significa ordinato / non ordinato in questo contesto? È correlato all'ordine crescente e all'ordine decrescente? In tal caso, Listnon viene ordinato 😕
malhobayyeb l'

4
Ordinato è quando i dati di input sono disposti esattamente come immessi dall'utente, mentre Ordinati è quando i dati di input sono ordinati lessicograficamente o in ordine crescente / decrescente (in termini di valori interi). Non ordinato significa che i dati di input possono o non possono essere memorizzati nell'ordine immesso dall'utente.
Akhil,

5

Elenco: l'
elenco consente elementi duplicati e valori null. Facile da cercare utilizzando l'indice corrispondente degli elementi e inoltre visualizzerà gli elementi in ordine di inserimento. Esempio: (LinkedList)

import java.util.*;

public class ListExample {

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    List<Integer> l=new LinkedList<Integer>();
    l.add(001);
    l.add(555);
    l.add(333);
    l.add(888);
    l.add(555);
    l.add(null);
    l.add(null);

    Iterator<Integer> il=l.iterator();

    System.out.println(l.get(0));

    while(il.hasNext()){
        System.out.println(il.next());
    }

    for(Integer str : l){
        System.out.println("Value:"+str);
    }
 }

}

Produzione:

1
1
555
333
888
555
null
null
Valore: 1
Valore: 555
Valore: 333
Valore: 888
Valore: 555
Valore: null
Valore: null

Set:
Set non consente alcun elemento duplicato e consente un singolo valore null.Non manterrà alcun ordine per visualizzare gli elementi.Solo TreeSetverrà visualizzato in ordine crescente.

Esempio: (TreeSet)

import java.util.TreeSet;

public class SetExample {

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    TreeSet<String> set = new TreeSet<String>();
    try {
        set.add("hello");
        set.add("world");
        set.add("welcome");
        set.add("all");

        for (String num : set) {
            System.out.println( num);

        }
        set.add(null);
    } catch (NullPointerException e) {
        System.out.println(e);
        System.out.println("Set doesn't allow null value and duplicate value");
    }

 }

}

Produzione:

tutto
ciao
benvenuto
mondo
java.lang.NullPointerException
Set non permette di valore nullo e valore duplicato


3

1.List consente valori duplicati e set non consente duplicati

2.List mantiene l'ordine in cui sono stati inseriti gli elementi nell'elenco Set non mantiene l'ordine. 3.List è una sequenza ordinata di elementi, mentre Set è un elenco distinto di elementi non ordinato.


3

Elenco Vs Set

1) Set non consente duplicati. Elenco consente duplicati. Basato sull'implementazione di Set, mantiene anche l'ordine di inserimento.

ad es LinkedHashSet. : . Mantiene l'ordine di inserimento. Fare clic qui

2) contiene metodo. Per natura del Set darà prestazioni migliori per l'accesso. Nel migliore dei casi è o (1). Ma List ha un problema di prestazioni da invocare contains.


2

Tutte le Listclassi mantengono l'ordine di inserimento. Usano implementazioni diverse in base alle prestazioni e ad altre caratteristiche (ad es. ArrayListPer la velocità di accesso a un indice specifico, LinkedListsemplicemente per mantenere l'ordine). Poiché non esiste una chiave, sono consentiti duplicati.

Le Setclassi non mantengono l'ordine di inserimento. Possono facoltativamente imporre un ordine specifico (come con SortedSet), ma in genere hanno un ordine definito dall'implementazione basato su una funzione hash (come con HashSet). Poiché Setè possibile accedere ai messaggi di posta elettronica, i duplicati non sono consentiti.


Maps archivia gli oggetti in base alla chiave, ma imposta gli oggetti store utilizzando un valore univoco correlato all'oggetto, in genere il suo codice hash. (Le mappe possono anche utilizzare i codici hash per verificare l'unicità delle chiavi, ma non sono obbligate a farlo.)
Quinn Taylor,

1

Ordine ... un elenco ha un ordine, un set no.


2
Set ADT non specifica l'ordinamento, ma alcune implementazioni di Set (come LinkedHashSet) mantengono l'ordine di inserimento.
Michael Myers

3
Tuttavia, la differenza più importante è che i set non consentono duplicati. Una borsa / multiset fa.
Quinn Taylor,

Un TreeSet ha un ordine.
stackoverflowuser2010

1

Poche note degne di nota tra List e Set in Java sono riportate come segue:

1) La differenza fondamentale tra List e Set in Java è consentire elementi duplicati. Elenco in Java consente duplicati mentre Set non consente duplicati. Se inserisci duplicati in Set, sostituirà il valore precedente. Qualsiasi implementazione di Set in Java conterrà solo elementi univoci.

2) Un'altra differenza significativa tra Elenco e Set in Java è l'ordine. Elenco è una raccolta ordinata mentre Set è una raccolta non ordinata. Elenco mantiene l'ordine di inserimento degli elementi, significa che qualsiasi elemento inserito prima andrà su un indice inferiore rispetto a qualsiasi elemento inserito dopo. Impostato in Java non mantiene alcun ordine. Sebbene Set fornisca un'altra alternativa chiamata SortedSet che può memorizzare gli elementi Set in un ordine di ordinamento specifico definito dai metodi Comparable e Comparator degli oggetti memorizzati in Set.

3) L'implementazione popolare dell'interfaccia List in Java include ArrayList, Vector e LinkedList. Mentre l'implementazione popolare dell'interfaccia Set include HashSet, TreeSet e LinkedHashSet.

È abbastanza chiaro che se è necessario mantenere l'ordine di inserimento o l'oggetto e la raccolta può contenere duplicati di Elenco è un modo per procedere. D'altra parte, se il tuo requisito è mantenere una raccolta unica senza duplicati rispetto a Set è la strada da percorrere.


Ciao @Vibha, se dovessi perdere entrambe le condizioni? Voglio dire che non voglio che i miei dati contengano duplicati e voglio anche che siano ordinati.
Panadol Chong,

1

Elenco:

  1. Duplicati ammessi.
  2. Ordinati in elementi di raggruppamento (in altre parole con ordine definito. Non è necessario ordinarli in ordine crescente)

Impostato:

  1. Duplicati non ammessi.
  2. Non ordinati in elementi di raggruppamento (in altre parole, senza un ordine definito. Potrebbe o non potrebbe essere organizzato in ordine crescente)

0

Set<E>e List<E>sono entrambi usati per memorizzare elementi di tipo E. La differenza è che Setè memorizzato in modo non ordinato e non consente valori duplicati. Listviene utilizzato per memorizzare gli elementi in modo ordinato e consente valori duplicati.

Setgli elementi non sono accessibili da una posizione di indice e gli Listelementi sono accessibili con una posizione di indice.


1
@BalusC, per favore, non commentare senza vedere la data del post. Vedi il post degno in quel momento.
Yash,

0

Salve Sono già state fornite così tante risposte ... Permettetemi di sottolineare alcuni punti che non sono stati menzionati finora:

  • La maggior parte delle implementazioni dell'elenco (ArrayList, Vector) implementa l'RandomAccess interfaccia che è un'interfaccia marcatore per un accesso più rapido. Nessuna delle implementazioni di Set lo fa.
  • L'elenco utilizza un Iteratore speciale chiamato ListIterator che supporta l'iterazione in entrambe le direzioni . Set utilizza Iterator che supporta solo l'iterazione a 1 via
  • HashSet occupa 5,5 volte più memoria di ArrayList per la memorizzazione dello stesso numero di elementi.

@smurti è un po 'in ritardo e non sono sicuro di averlo notato, ma il tuo primo punto si contraddice: "La maggior parte delle implementazioni della Lista (ArrayList, Vector) implementa RandomAccess ..." e "... Nessuna della Lista le implementazioni lo fanno "
Peter M

0

La più grande differenza è il concetto di base.

Dall'interfaccia Set and List . Set è il concetto di matematica.Il metodo Set estende la raccolta, tuttavia non aggiunge un nuovo metodo. size () significa cardinalità (altro è BitSet.cardinality, contatore lineare , Log Log , HyperLogLog ). addAll () significa unione. retainAll () significa intersezione. removeAll () significa differenza.

Tuttavia, elenca la mancanza di questi concetti. L'elenco aggiunge molti metodi per supportare il concetto di sequenza che l' interfaccia Collection non fornisce. il concetto di base è INDICE . come add (index, element), get (index), search (indexOf ()), remove (index) element. L'elenco fornisce anche l'elenco secondario " Vista raccolta " . Set non ha vista. non hanno accesso posizionale. L'elenco fornisce anche molti algoritmi nelle raccolte classe . sort (List), binarySearch (List), inversa (List), Shuffle (List), fill (List). il parametro params è l' interfaccia Elenco . elementi duplicati sono solo il risultato di concetti. non la differenza essenziale.

Quindi la differenza essenziale è il concetto. L'insieme è concetto dell'insieme di matematica. L'elenco è il concetto di sequenza.


-1

Ecco un chiaro esempio di groovy. creo un set e un elenco. quindi provo a memorizzare 20 valori generati casualmente all'interno di ciascun elenco. il valore generato può essere compreso tra 0 e 5

s = [] as Set
l = []

max = 5
print "random Numbers :"
20.times{
e = (int)Math.random()*max
s << e
l << e
print "$e, "
}


println "\n"
println "Set : $s "
println "list : $l

Il risultato :

numeri casuali: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

Impostato : [4, 1, 0, 2, 3]

elenco : [4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]

Puoi vedere che la differenza è che:

  • Set non consente valori duplicati.
  • L'elenco consente valori duplicati.

1
Gli elenchi mantengono anche l'ordine.
glen3b,

-1

Come la risposta poiché SET non ha un valore duplicato e List can. Naturalmente, l'ordine è un'altra cosa per differenziarli.


-1

Set: un set non può avere elementi duplicati nelle sue raccolte. è anche una raccolta non ordinata. Per accedere ai dati da Set, è necessario utilizzare solo Iterator e non è possibile il recupero basato sull'indice. Viene utilizzato principalmente ogni volta che è richiesta la raccolta di unicità.

Elenco: un elenco può avere elementi duplicati, con l'ordine naturale inserito. Pertanto, è possibile recuperare i dati in base all'indice o all'iteratore. È ampiamente utilizzato per archiviare la raccolta che deve accedere in base all'indice.


-2

ARGOMENTO Nome: Elenco VS Set

Ho appena esaminato l'argomento più importante di Java chiamato Collections Framework. Ho pensato di condividere con te la mia piccola conoscenza delle Collezioni. Elenco, Set, Mappa sono l'argomento più importante di esso. Quindi iniziamo con Elenco e Set.

Differenza tra elenco e set:

  1. Elenco è una classe di raccolta che estende la AbstractListclasse dove Set è una classe di raccolta che estende la AbstractSetclasse ma implementa entrambe l'interfaccia di raccolta.

  2. L'interfaccia Elenco consente valori duplicati (elementi) mentre Imposta interfaccia non consente valori duplicati. In caso di elementi duplicati in Set, sostituisce i valori precedenti.

  3. L'interfaccia dell'elenco consente valori NULL, mentre come interfaccia Set non consente valori Null. Nel caso in cui si utilizzino i valori Null in Set, si ottiene NullPointerException.

  4. L'interfaccia dell'elenco mantiene l'ordine di inserimento. Ciò significa che aggiungiamo gli elementi nella Lista nello stesso modo in cui li otteniamo usando iteratore o per ogni stile. Considerando che le Setimplementazioni non mantengono necessariamente l'ordine di inserimento. (Sebbene SortedSetutilizzi TreeSete LinkedHashSetmantenga l'ordine di inserimento).

  5. L'interfaccia dell'elenco ha i propri metodi definiti mentre l'interfaccia Set non ha il proprio metodo, quindi Set utilizza solo i metodi dell'interfaccia Collection.

  6. L'interfaccia dell'elenco ha una classe legacy chiamata Vectormentre Set interface non ha alcuna classe legacy

  7. Ultimo ma non meno importante ... Il listIterator()metodo può essere utilizzato solo per scorrere gli elementi all'interno delle Classi elenco mentre possiamo usare il metodo iterator () per accedere agli elementi della classe Set

Nient'altro possiamo aggiungere? Per favore mi faccia sapere.

Grazie.


Per uno, Liste Setsono interfacce che hanno anche implementazioni "base" sotto forma di una classe astratta (che hai menzionato). Inoltre, # 3 è completamente impreciso , poiché la maggior parte dei set consente valori null (ma dipende dall'implementazione). Non capisco # 5 e # 7, e per # 6 Vectornon è legacy, ma è solo sincronizzato e non è preferito per l'uso tranne quando è necessaria la sincronizzazione.
glen3b,

-3

Impostato:

Impossibile avere valori duplicati L'ordinamento dipende dall'implementazione. Per impostazione predefinita, non è ordinato Impossibile accedere per indice

Elenco:

Può avere valori duplicati Ordinati per impostazione predefinita Può avere accesso per indice

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.