Jaka jest różnica między zestawem a listą?


Odpowiedzi:


504

Listjest uporządkowaną sekwencją elementów, podczas gdy Setjest wyraźną listą elementów, która jest nieuporządkowana (dziękuję, Quinn Taylor ).

List<E>:

Uporządkowana kolekcja (znana również jako sekwencja). Użytkownik tego interfejsu ma precyzyjną kontrolę nad tym, gdzie na liście wstawiany jest każdy element. Użytkownik może uzyskać dostęp do elementów według indeksu liczb całkowitych (pozycja na liście) i wyszukiwać elementy na liście.

Set<E>:

Kolekcja, która nie zawiera zduplikowanych elementów. Bardziej formalnie, zestawy nie zawierają pary elementów e1 i e2, tak że e1.equals (e2), a co najwyżej jeden element zerowy. Jak sugeruje jego nazwa, interfejs ten modeluje abstrakcję zestawu matematycznego.


7
W przypadku SortedSet nie ma dwóch elementów, w których compareTo () == 0, ponieważ nie jest wywoływany równy.
Peter Lawrey,

34
Zestaw MOŻE być zamówiony, więc pierwsze stwierdzenie tej odpowiedzi jest mylące, nawet jeśli oczywiście należy wybrać Listę w celu wykonania nakazu
odbioru

24
ŹLE! Zestaw Java można zamówić, w zależności od implementacji; na przykład zamówiony jest zestaw Java TreeSet. W kontekście Javy jedyną różnicą między Listą a Zestawem jest to, że Zestaw zawiera unikalne elementy. W kontekście matematyki elementy zestawu są unikalne i nieuporządkowane.
stackoverflowuser2010

44
Tak, zestaw Java MOŻE BYĆ, ALE NIE jest KONIECZNIE zamówiony. Tak, jeśli masz zestaw TreeSet, możesz liczyć na to, że zostanie zamówiony. Ale musisz WIEDZIEĆ, że masz TreeSet, a nie tylko zestaw. Jeśli otrzymasz zestaw, nie możesz polegać na tym, który zostanie zamówiony. Z drugiej strony Lista jest uporządkowana z samej swojej natury i każda implementacja Listy musi być zamówiona. Tak więc, zgodnie z definicją interfejsu, nie jest szczególnie błędne stwierdzenie, że Zestaw jest nieuporządkowany, ale być może bardziej technicznie poprawne jest stwierdzenie, że Zestaw nie daje gwarancji kolejności elementów.
Spanky Quigman

14
Nie łącz „zamówionych” z „posortowanymi”. Podobnie nie należy łączyć umowy dotyczącej interfejsu i implementacji interfejsu. Błędem jest również stwierdzenie, że coś, co jest „nieuporządkowane”, nie ma żadnego porządku, oznacza to po prostu, że nie ma żadnych gwarancji dotyczących realizacji zamówienia (i że kolejność może nie być stabilna między rozmowami, w przeciwieństwie do listy uporządkowanej).
lilbyrdie

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

2
Należy zwrócić uwagę na jedno: wydajność dostępu pozycyjnego zależy w dużej mierze od podstawowej implementacji, tablica vs lista połączona stackoverflow.com/questions/322715/…
Christophe Roussy

1
W jaki sposób zestawy są indeksowane, jeśli nie według dostępu pozycyjnego? (+1 dla tabeli ASCII)
tplive

72

Uporządkowane listy elementów (unikalne lub nie)
Zgodne z interfejsem Java o nazwieList
Można uzyskać dostęp przez indeks

zaimplementowano za pomocą

  • Połączona lista
  • ArrayList

Wykazy unikalnych elementów:
Zgodne z interfejsu Java o nazwieSet
może nie być dostępne przez indeks

zaimplementowano za pomocą

  • HashSet (nieuporządkowany)
  • LinkedHashSet (zamówiono)
  • TreeSet (posortowane według porządku naturalnego lub według dostarczonego komparatora)

Oba interfejsy Seti Listsą zgodne z interfejsem Java o nazwieCollection


28

Zestaw nie może zawierać zduplikowanych elementów, podczas gdy lista może. Lista (w Javie) oznacza również porządek.


16
  • Lista to uporządkowana grupa elementów
  • Zestaw to nieuporządkowana grupa elementów bez dozwolonych duplikatów (zwykle)

Pod względem koncepcyjnym zwykle mówimy o nieuporządkowanym grupowaniu, które zezwala na duplikaty jako worek, a nie zezwala na duplikaty, to zestaw.


Zestaw nie może mieć duplikatów.
karim79

Niektóre implementacje zestawów są uporządkowane (takie jak LinkedHashSet, który utrzymuje LinkedList za scenami). Ale Zestaw ADT nie ma kolejności.
Michael Myers

10

Lista

  1. Jest uporządkowaną grupą elementów.
  2. Lista służy do gromadzenia elementów z duplikatami.
  3. Nowe metody są zdefiniowane w interfejsie List.

Zestaw

  1. Jest nieuporządkowaną grupą elementów.
  2. Zestaw służy do zbierania elementów bez duplikatów.
  3. Żadne nowe metody nie są zdefiniowane w interfejsie Set, dlatego musimy używać metod interfejsu Collection tylko z podklasami Set.

10

Lista:

ListNa ogół zezwalają na powielanie obiektów. Lists muszą być zamawiane i dlatego są dostępne według indeksu.

Klasy wdrożeniowe obejmują: ArrayList, LinkedList,Vector

Zestaw:

Sets ma nie dopuszczać duplikaty obiektów. Większość implementacji jest nieuporządkowana, ale jest specyficzna dla implementacji.

Klasy implementacji obejmują: HashSet(nieuporządkowany), LinkedHashSet(uporządkowany), TreeSet(uporządkowany według porządku naturalnego lub dostarczonego komparatora)


7

Skoro mówimy o interfejsach Java, dlaczego nie spojrzeć na Javadoc?!

  • A Listjest uporządkowaną kolekcją (sekwencją), która zazwyczaj pozwala na duplikaty
  • Jest Setto kolekcja, która nie zawiera zduplikowanych elementów, kolejność iteracji może być zagwarantowana przez implementację

Nie ma wzmianki o braku porządku w zestawach: zależy to od implementacji.


2
Poprawny. LinkedHashSet zawiera elementy w kolejności wstawiania.
ggb667,

To interfejs, WSZYSTKO zależy od implementacji. List.get () może utworzyć plik zawierający pierwsze 5 miejsc po przecinku liczby pi i rzucić StackOverFlowException w niektórych implementacjach, nie oznacza to, że możesz powiedzieć „Lista to coś, co może tworzyć pliki”, ponieważ nie jest to część umowa zdefiniowana przez interfejs. Dokumenty twierdzą, że zbiór jest wzorowany na matematycznej koncepcji zbioru, który z definicji nie jest uporządkowany. Biorąc pod uwagę zestaw w kodzie, nie można założyć, że jest on zamówiony bez naruszenia zasad SOLID.
sara

@ kai, zwykle trzymam LinkedHashSetsię lewej strony, jeśli kod zależy od zamówienia później. Używam go tylko Setwtedy, gdy naprawdę go używam, ponieważ nie można założyć, że podstawowa implementacja jest podobna, LinkedHashSetmoże być dzisiaj, ale jutro kod się zmieni i zawiedzie.
Christophe Roussy

Jeśli zadeklarujesz LinkedHashSet, nie masz do czynienia z zestawem, więc zgłaszanie roszczeń dotyczących zachowania zestawów nie ma większego znaczenia. Powiedziałbym, że przypisywanie (możliwej) uporządkowania zestawom opartym na niektórych implementacjach jest podobne do powiedzenia: „Instancje Runnable mają metodę uruchamiania przeznaczoną do uruchomienia w pewnym wątku. Otwierają również połączenie DB i odczytują dane klientów w zależności od implementacji. „ Oczywiście niektóre implementacje mogą to zrobić, ale nie jest to sugerowane przez Runnable Interface.
sara,

5

To może nie być odpowiedź, której szukasz, ale JavaDoc klas kolekcji jest w rzeczywistości dość opisowy. Skopiuj / wklej:

Uporządkowana kolekcja (znana również jako sekwencja). Użytkownik tego interfejsu ma precyzyjną kontrolę nad tym, gdzie na liście wstawiany jest każdy element. Użytkownik może uzyskać dostęp do elementów według indeksu liczb całkowitych (pozycja na liście) i wyszukiwać elementy na liście.

W przeciwieństwie do zestawów, listy zazwyczaj pozwalają na duplikowanie elementów. Bardziej formalnie, listy zwykle dopuszczają pary elementów e1 i e2, tak że e1.equals (e2), i zazwyczaj pozwalają na wiele elementów zerowych, jeśli w ogóle dopuszczają elementy zerowe. Nie jest wykluczone, że ktoś może chcieć zaimplementować listę, która zabrania duplikatów, rzucając wyjątki czasu wykonywania, gdy użytkownik próbuje je wstawić, ale spodziewamy się, że takie użycie będzie rzadkie.


5

Zestaw to nieuporządkowana grupa odrębnych obiektów - niedozwolone są duplikaty obiektów. Zasadniczo jest to realizowane za pomocą kodu skrótu wstawianych obiektów. (Określone implementacje mogą dodawać kolejność, ale sam interfejs Set nie.)

Lista to uporządkowana grupa obiektów, która może zawierać duplikaty. To może być realizowane ze związkiem ArrayList, LinkedListitp


1
Jestem zdezorientowany 😕! Co w tym kontekście oznacza uporządkowane / nieuporządkowane? Czy ma to związek z kolejnością rosnącą i malejącą? Jeśli tak, Listnie zamówiono 😕
malhobayyeb

4
Kolejność jest uporządkowana, gdy dane wejściowe są ułożone dokładnie tak, jak zostało wprowadzone przez użytkownika, natomiast Sortowanie następuje, gdy dane wejściowe są sortowane leksykograficznie lub w porządku rosnącym / malejącym (pod względem wartości całkowitych). Nieuporządkowany oznacza, że ​​dane wejściowe mogą, ale nie muszą być przechowywane w kolejności wprowadzonej przez użytkownika.
Akhil

5

Lista:
Lista umożliwia duplikowanie elementów i wartości zerowych. Łatwe wyszukiwanie za pomocą odpowiedniego indeksu elementów, a także wyświetla elementy w kolejności wstawiania. Przykład: (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);
    }
 }

}

Wynik:

1
1
555
333
888
555
null
null
Wartość: 1
Wartość: 555
Wartość: 333
Wartość: 888
Wartość: 555
Wartość: null
Wartość: null

Zestaw:
zestaw nie zezwala na żadne zduplikowane elementy i pozwala na pojedynczą pustą wartość. Nie będzie utrzymywał żadnej kolejności wyświetlania elementów. Tylko TreeSetbędzie wyświetlany w kolejności rosnącej.

Przykład: (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");
    }

 }

}

Wynik:

all
hello
welcome
world zestaw
java.lang.NullPointerException
nie zezwala na wartość zerową ani na zduplikowaną wartość


3

1.Lista zezwala na duplikaty wartości, a zestaw nie zezwala na duplikaty

2.Lista zachowuje kolejność, w której elementy zostały wstawione do listy Zestaw nie zachowuje kolejności. 3.Lista jest uporządkowaną sekwencją elementów, natomiast Set jest odrębną listą elementów, która jest nieuporządkowana.


3

Zestaw Vs Set

1) Zestaw nie zezwala na duplikaty. Lista pozwala na duplikowanie. W oparciu o implementację Seta, zachowuje także kolejność wstawiania.

np LinkedHashSet. : Utrzymuje kolejność wprowadzania. Proszę kliknąć tutaj

2) zawiera metodę. Z natury zestawu zapewni lepszą wydajność dostępu. Najlepszy przypadek to o (1). Ale List ma problem z wydajnością do wywołania contains.


2

Wszystkie Listklasy zachowują kolejność wstawiania. Używają różnych implementacji opartych na wydajności i innych cechach (np. ArrayListDla szybkości dostępu do określonego indeksu, LinkedListpo prostu utrzymania porządku). Ponieważ nie ma klucza, duplikaty są dozwolone.

Na Setzajęcia nie utrzymują kolejność wstawiania. Mogą opcjonalnie narzucić określoną kolejność (jak w przypadku SortedSet), ale zazwyczaj mają kolejność zdefiniowaną w implementacji na podstawie niektórych funkcji skrótu (jak w przypadku HashSet). Ponieważ Sets są dostępne za pomocą klucza, duplikaty nie są dozwolone.


Mapy przechowują obiekty według klucza, ale ustawiają obiekty przechowywania przy użyciu unikalnej wartości związanej z obiektem, zwykle jego hash. (Mapy mogą również używać kodów skrótu do sprawdzania unikatowości klucza, ale nie są one wymagane).
Quinn Taylor

1

Zamawianie ... lista ma porządek, zestaw nie.


2
Zestaw ADT nie określa kolejności, ale niektóre implementacje zestawu (takie jak LinkedHashSet) zachowują kolejność wstawiania.
Michael Myers

3
Jednak ważniejsza różnica polega na tym, że zestawy nie zezwalają na duplikaty. Tak działa torba / multiset.
Quinn Taylor

TreeSet ma zamawianie.
stackoverflowuser2010,

1

Kilka godnych uwagi różnic między Listą a Setem w Javie podano w następujący sposób:

1) Podstawowa różnica między List a Set w Javie pozwala na duplikowanie elementów. Lista w Javie zezwala na duplikaty, a Set nie zezwala na żadne duplikaty. Jeśli wstawisz duplikat w zestawie, zastąpi on starszą wartość. Każda implementacja Set w Javie będzie zawierała tylko unikalne elementy.

2) Kolejną znaczącą różnicą między List a Set w Javie jest kolejność. Lista jest zbiorem uporządkowanym, a Set jest zbiorem nieuporządkowanym. Lista zachowuje kolejność wstawiania elementów, oznacza to, że każdy element wstawiony wcześniej przejdzie na niższy indeks niż jakikolwiek element wstawiony później. Ustawiony w Javie nie utrzymuje żadnej kolejności. Chociaż zestaw zapewnia kolejną alternatywę o nazwie SortedSet, która może przechowywać elementy zestawu w określonej kolejności sortowania zdefiniowanej metodami Porównywalne i Porównawcze obiektów przechowywanych w zestawie.

3) Popularna implementacja interfejsu List w Javie obejmuje ArrayList, Vector i LinkedList. Podczas gdy popularna implementacja interfejsu Set obejmuje HashSet, TreeSet i LinkedHashSet.

Jest całkiem jasne, że jeśli chcesz zachować kolejność wstawiania lub obiekt, a Twoja kolekcja może zawierać duplikaty, List jest dobrym rozwiązaniem. Z drugiej strony, jeśli twoim wymogiem jest utrzymanie unikalnej kolekcji bez duplikatów, Set jest dobrym rozwiązaniem.


Cześć @Vibha, Jeśli chcę spełnić oba warunki? Mam na myśli, że nie chcę, aby moje dane zawierały duplikaty, a także chcę, aby były uporządkowane.
Panadol Chong

1

Lista:

  1. Dozwolone duplikaty.
  2. Uporządkowane w elementach grupujących (innymi słowy o określonej kolejności. Nie trzeba sortować w kolejności rosnącej)

Zestaw:

  1. Niedozwolone duplikaty.
  2. Nieuporządkowane w elementach grupujących. (Innymi słowy, które nie mają określonej kolejności. Może lub nie mogą być ułożone w porządku rosnącym)

0

Set<E>i List<E>oba służą do przechowywania elementów typu E. Różnica polega na tym, że Setjest przechowywana w nieuporządkowany sposób i nie pozwala na duplikowanie wartości. Listsłuży do przechowywania elementów w uporządkowany sposób i pozwala na duplikowanie wartości.

Setdo elementów nie można uzyskać dostępu za pomocą pozycji indeksu, a do Listelementów można uzyskać dostęp za pomocą pozycji indeksu.


1
@BalusC proszę nie komentować, nie widząc daty ogłoszenia. Zobacz post godny w tym czasie.
Yash

0

Cześć Tak wiele odpowiedzi jest już podanych .. Pozwól mi wskazać kilka punktów, które nie zostały jeszcze wspomniane:

  • Większość implementacji List (ArrayList, Vector) implementujeRandomAccess interfejs, który jest interfejsem znacznika dla szybszego dostępu. Żadna z implementacji Seta tego nie robi.
  • List używa jednego specjalnego Iteratora, ListIterator który obsługuje iterację w obu kierunkach . Zestaw używa Iteratora, który obsługuje tylko iterację jednokierunkową
  • HashSet trwa 5,5 razy więcej pamięci niż ArrayList do przechowywania samą liczbę elementów.

@smurti to trochę za późno i nie jestem pewien, czy zauważyłeś, ale twój pierwszy punkt zaprzecza samemu sobie: „Większość implementacji List (ArrayList, Vector) implementuje RandomAccess ...” i „... Żadna z List wdrożenia to robią ”
Peter M,

0

Największy inny to podstawowa koncepcja.

Z interfejsu Set and List . Zestaw to koncepcja matematyki. Metoda set rozszerza kolekcję. Nie dodawaj jednak nowej metody. size () oznacza liczność (więcej to BitSet.cardinality, Licznik liniowy, Log Log, HyperLogLog ). addAll () oznacza union. retainAll () oznacza skrzyżowanie. removeAll () oznacza różnicę.

Wymień jednak brak tych pojęć. Lista dodaje wiele metod do obsługi koncepcji sekwencji, których interfejs kolekcji nie zapewnia. podstawową koncepcją jest INDEKS . jak add (indeks, element), get (indeks), search (indexOf ()), remove (indeks) element. Lista zawiera również podlistęWidok kolekcji ” . Zestaw nie ma widoku. nie mają dostępu pozycyjnego. Lista zawiera również wiele algorytmów w klasie Kolekcje . sort (lista), binarySearch (lista), wstecz (lista), losowanie (lista), fill (lista). Params metody to interfejs listy . zduplikowane elementy są tylko wynikiem pojęć. nie zasadnicza różnica.

Zatem zasadniczą różnicą jest koncepcja. Zestaw to koncepcja zestawu matematyki. Lista jest pojęciem sekwencji.


-1

Oto wyraźny przykład z groovy. tworzę zestaw i listę. następnie próbuję zapisać 20 losowo wygenerowanych wartości na każdej liście. wygenerowana wartość może mieścić się w zakresie od 0 do 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

Wynik :

losowe liczby: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

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

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

Widać różnicę:

  • Zestaw nie zezwala na powielanie wartości.
  • Lista pozwala na duplikowanie wartości.

1
Listy również utrzymują porządek.
glen3b

-1

Podobnie jak odpowiedź, ponieważ SET nie ma zduplikowanej wartości, a List może. Oczywiście kolejność to kolejna rzecz, która odróżnia je od siebie.


-1

Zestaw: zestaw nie może mieć zduplikowanych elementów w swoich kolekcjach. jest to również kolekcja nieuporządkowana. Aby uzyskać dostęp do danych z zestawu, należy użyć tylko iteratora, a pobieranie na podstawie indeksu nie jest możliwe. Stosuje się go głównie wtedy, gdy jest wymagana kolekcja wyjątkowości.

Lista: lista może zawierać zduplikowane elementy, z naturalnym uporządkowaniem w trakcie wstawiania. W ten sposób można wyszukiwać dane na podstawie indeksu lub iteratora. Jest szeroko stosowany do przechowywania kolekcji, która wymaga dostępu na podstawie indeksu.


-2

TEMAT Nazwa: Lista VS Zestaw

Właśnie przejrzałem najważniejszy temat Javy zwany kolekcjami Framework. Chciałem podzielić się z Wami moją małą wiedzą na temat Kolekcji. Najważniejszym tematem jest lista, zestaw, mapa. Zacznijmy od List and Set.

Różnica między listą a zestawem:

  1. List jest klasą kolekcji, która rozszerza AbstractListklasę, gdzie jako Set jest klasą kolekcji, która rozszerza AbstractSetklasę, ale oba implementują interfejs Collection.

  2. Interfejs listy pozwala na duplikowanie wartości (elementów), podczas gdy interfejs Set nie pozwala na duplikowanie wartości. W przypadku zduplikowanych elementów w zestawie zastępuje starsze wartości.

  3. Interfejs listy dopuszcza wartości NULL, przy czym interfejs Set nie dopuszcza wartości NULL. W przypadku użycia wartości Null w Set daje NullPointerException.

  4. Interfejs listy utrzymuje porządek wstawiania. Oznacza to sposób dodawania elementów na liście w taki sam sposób, w jaki uzyskujemy je za pomocą iteratora lub dla każdego stylu. Podczas gdy Setimplementacje niekoniecznie utrzymują porządek wstawiania. (Mimo SortedSetże używa TreeSeti LinkedHashSetutrzymuje kolejność wstawiania).

  5. Interfejs listy ma zdefiniowane własne metody, natomiast interfejs Set nie ma własnej metody, dlatego Set używa tylko metod interfejsu Collection.

  6. Interfejs listy ma jedną klasę zwaną, Vectorpodczas gdy interfejs Set nie ma żadnej klasy starszej

  7. Last but not not least ... listIterator()Metodę można wykorzystać tylko do przełączania elementów w klasach list, podczas gdy możemy użyć metody iterator (), aby uzyskać dostęp do elementów klasy Set

Czy możemy jeszcze coś dodać? Proszę daj mi znać.

Dzięki.


Z jednej strony, Listi Setto interfejsy które również posiadają „baza” implementacje w formie abstrakcyjnej klasy (którego wspomniana). Ponadto nr 3 jest całkowicie niedokładny , ponieważ większość zestawów dopuszcza wartości zerowe (ale zależne od implementacji). Nie rozumiem # 5 i # 7, a dla # 6 Vectornie jest starsza, ale jest po prostu zsynchronizowany i nie jest preferowany do użycia, z wyjątkiem sytuacji, gdy wymagana jest synchronizacja.
glen3b

-3

Zestaw:

Nie może mieć zduplikowanych wartości Kolejność zależy od implementacji. Domyślnie nie jest uporządkowane. Nie można uzyskać dostępu według indeksu

Lista:

Może mieć zduplikowane wartości Domyślnie uporządkowane Może mieć dostęp według indeksu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.