Jaka jest podstawowa różnica między interfejsami Set<E>
a List<E>
?
Jaka jest podstawowa różnica między interfejsami Set<E>
a List<E>
?
Odpowiedzi:
List
jest uporządkowaną sekwencją elementów, podczas gdy Set
jest wyraźną listą elementów, która jest nieuporządkowana (dziękuję, Quinn Taylor ).
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.
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.
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Uporządkowane listy elementów (unikalne lub nie)
Zgodne z interfejsem Java o nazwieList
Można uzyskać dostęp przez indeks
zaimplementowano za pomocą
Wykazy unikalnych elementów:
Zgodne z interfejsu Java o nazwieSet
może nie być dostępne przez indeks
zaimplementowano za pomocą
Oba interfejsy Set
i List
są zgodne z interfejsem Java o nazwieCollection
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.
Lista
Zestaw
List
Na ogół zezwalają na powielanie obiektów.
List
s muszą być zamawiane i dlatego są dostępne według indeksu.
Klasy wdrożeniowe obejmują: ArrayList
, LinkedList
,Vector
Set
s 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)
Skoro mówimy o interfejsach Java, dlaczego nie spojrzeć na Javadoc?!
List
jest uporządkowaną kolekcją (sekwencją), która zazwyczaj pozwala na duplikatySet
to 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.
LinkedHashSet
się lewej strony, jeśli kod zależy od zamówienia później. Używam go tylko Set
wtedy, gdy naprawdę go używam, ponieważ nie można założyć, że podstawowa implementacja jest podobna, LinkedHashSet
może być dzisiaj, ale jutro kod się zmieni i zawiedzie.
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.
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
, LinkedList
itp
List
nie zamówiono 😕
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 TreeSet
bę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ść
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.
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
.
Wszystkie List
klasy zachowują kolejność wstawiania. Używają różnych implementacji opartych na wydajności i innych cechach (np. ArrayList
Dla szybkości dostępu do określonego indeksu, LinkedList
po prostu utrzymania porządku). Ponieważ nie ma klucza, duplikaty są dozwolone.
Na Set
zaję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ż Set
s są dostępne za pomocą klucza, duplikaty nie są dozwolone.
Zamawianie ... lista ma porządek, zestaw nie.
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.
Lista:
Zestaw:
Set<E>
i List<E>
oba służą do przechowywania elementów typu E
. Różnica polega na tym, że Set
jest przechowywana w nieuporządkowany sposób i nie pozwala na duplikowanie wartości. List
służy do przechowywania elementów w uporządkowany sposób i pozwala na duplikowanie wartości.
Set
do elementów nie można uzyskać dostępu za pomocą pozycji indeksu, a do List
elementów można uzyskać dostęp za pomocą pozycji indeksu.
Cześć Tak wiele odpowiedzi jest już podanych .. Pozwól mi wskazać kilka punktów, które nie zostały jeszcze wspomniane:
RandomAccess
interfejs, który jest interfejsem znacznika dla szybszego dostępu. Żadna z implementacji Seta tego nie robi.ListIterator
który obsługuje iterację w obu kierunkach . Zestaw używa Iteratora, który obsługuje tylko iterację jednokierunkową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.
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: 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.
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:
List jest klasą kolekcji, która rozszerza AbstractList
klasę, gdzie jako Set jest klasą kolekcji, która rozszerza AbstractSet
klasę, ale oba implementują interfejs Collection.
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.
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
.
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 Set
implementacje niekoniecznie utrzymują porządek wstawiania. (Mimo SortedSet
że używa TreeSet
i LinkedHashSet
utrzymuje kolejność wstawiania).
Interfejs listy ma zdefiniowane własne metody, natomiast interfejs Set nie ma własnej metody, dlatego Set używa tylko metod interfejsu Collection.
Interfejs listy ma jedną klasę zwaną, Vector
podczas gdy interfejs Set nie ma żadnej klasy starszej
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.
List
i Set
to 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 Vector
nie jest starsza, ale jest po prostu zsynchronizowany i nie jest preferowany do użycia, z wyjątkiem sytuacji, gdy wymagana jest synchronizacja.
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