Jakiej kolekcji Java powinienem użyć?
W tym pytaniu Jak efektywnie wybrać kontener biblioteki standardowej w C++11? jest przydatnym schematem do użycia przy wyborze kolekcji C++.
Pomyślałem, że jest to przydatny zasób dla ludzi, którzy nie są pewni, której kolekcji powinni używać, więc próbowałem znaleźć podobny schemat blokowy dla Javy i nie byłem w stanie tego zrobić.
Jakie zasoby i "ściągi" są dostępne, aby pomóc ludziom wybrać odpowiednią kolekcję do wykorzystania podczas programowania w Javie? Jak czy ludzie wiedzą, jakich implementacji List, zestawów i Map powinni używać?
4 answers
Ponieważ nie mogłem znaleźć podobnego schematu, postanowiłem zrobić go sam.
Ten schemat blokowy nie próbuje i obejmuje rzeczy, takie jak synchronized access, bezpieczeństwo wątku itp lub starsze kolekcje, ale obejmuje 3 standardowe Zestaws, 3 standardowe MapaS I 2 standardowe lista s.
ten obrazek został stworzony dla tej odpowiedzi i jest dostępny na licencji Creative Commons Attribution 4.0 International License. najprostszy przypisanie polega na linkowaniu do tego pytania lub odpowiedzi.
Inne zasoby
Prawdopodobnie najbardziej użytecznym innym odniesieniem jest następująca strona z dokumentacji oracle, która opisuje każdy zbiór.
HashSet vs TreeSet
Tutaj znajduje się szczegółowa dyskusja o tym, kiedy używać HashSet
LUB TreeSet
:
Hashset vs Treeset
ArrayList vs LinkedList
Szczegółowa dyskusja: kiedy użyj LinkedList nad ArrayList?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31
Podsumowanie głównych nie-równoległych, nie-zsynchronizowanych zbiorów
Collection
: interfejs reprezentujący nieuporządkowany "worek" przedmiotów, zwany "elementami". Element" następny " jest niezdefiniowany (losowy).
-
Set
: interfejs reprezentującyCollection
bez duplikatów.-
HashSet
: ASet
Hashtable
. Najszybsze i najmniejsze zużycie pamięci, przy zamawianiu jest nieważne. -
LinkedHashSet
: aHashSet
z dodaniem listy połączonej do elementów powiązanych w porządku wstawiania. Element" następny " jest kolejnym-ostatnio wstawionym elementem. -
TreeSet
: ASet
gdzie elementy są uporządkowane przezComparator
(typowo porządkowanie naturalne ). Najwolniejsze i największe zużycie pamięci, ale niezbędne do zamawiania w oparciu o komparator. -
EnumSet
: niezwykle szybki i wydajnySet
dostosowany do pojedynczego typu enum.
-
-
List
: interfejs reprezentującyCollection
, którego elementy są uporządkowane, a każdy z nich ma indeks liczbowy reprezentujący jego pozycję, gdzie zero jest pierwszym elementem, a(length - 1)
ostatnim.-
ArrayList
: aList
wspierane przez tablicę, gdzie tablica ma długość (zwaną "pojemnością"), która jest co najmniej tak duża jak liczba elementów ("rozmiar" listy). Kiedy rozmiar przekracza pojemność (po dodaniu elementu(capacity + 1)-th
), tablica jest odtwarzana z nową pojemnością(new length * 1.5)
--to odtworzenie jest szybkie, ponieważ używaSystem.arrayCopy()
. Usuwanie i wstawianie/dodawanie elementów wymaga, aby wszystkie sąsiednie elementy (po prawej stronie) były przesunięte w tę przestrzeń lub poza nią. Dostęp do dowolnego elementu jest szybki, ponieważ wymaga tylko obliczenia(element-zero-address + desired-index * element-size)
, aby znaleźć jego lokalizację. w większości sytuacji ,ArrayList
jest preferowany zamiastLinkedList
. -
LinkedList
: aList
wspierane przez zbiór obiektów, z których każdy jest powiązany z" poprzednimi "i" kolejnymi " sąsiadami. ALinkedList
to takżeQueue
iDeque
. Dostęp do elementów odbywa się począwszy od pierwszego lub ostatniego elementu i przechodzi aż do osiągnięcia żądanego indeksu. Wstawianie i usuwanie, gdy pożądany indeks zostanie osiągnięty poprzez przejście jest trywialną sprawą ponownego mapowania tylko linków bezpośrednio sąsiadujących, aby wskazać nowy element lub ominąć teraz-usunięty element.
-
-
Map
: interfejs reprezentującyCollection
, gdzie każdy element ma identyfikujący "klucz" - każdy element jest parą klucz-wartość.-
HashMap
: aMap
gdzie klucze nie są uporządkowane i wspierane przezHashtable
. -
LinkedhashMap
: klucze są uporządkowane według w kolejności wstawiania . -
TreeMap
: aMap
, gdzie klucze są uporządkowane przez aComparator
(zazwyczaj naturalna kolejność).
-
-
Queue
: interfejs, który reprezentujeCollection
, gdzie elementy są zazwyczaj dodawane na jednym końcu i usuwane z drugiego (FIFO: first-in, first-out). -
Stack
: interfejs, który reprezentujeCollection
, gdzie elementy są zazwyczaj zarówno dodawane (wypychane), jak i usuwane (popped) z tego samego końca (LIFO: last-in, first-out). -
Deque
: skrót od " double ended Kolejka", zwykle wymawiane jako "deck". Lista połączona, która jest zwykle dodawana i odczytywana tylko z obu końców(nie ze środka).
Podstawowe schematy kolekcji:
Porównując wstawianie elementu z ArrayList
i LinkedList
:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-17 23:10:13
Jeszcze prostszy obraz jest tutaj. Celowo uproszczone!
Zbiór to wszystko, co zawiera dane zwane "elementami" (tego samego typu). Nie przyjmuje się nic bardziej szczegółowego.
-
Lista jest zindeksowanym zbiorem danych, gdzie każdy element ma indeks. Coś jak tablica, ale bardziej elastyczne.
Dane na liście zachowują kolejność wstawiania.
-
Zestaw jest workiem elementów , każdy elementy tylko raz (elementy są rozróżniane za pomocą metody
equals()
.Dane w zestawie są przechowywane głównie po to, aby wiedzieć jakie są tam dane.
-
Map jest czymś w rodzaju listy, ale zamiast uzyskiwać dostęp do elementów za pomocą ich indeksu całkowitego, można uzyskać do nich dostęp za pomocą klucza , który jest dowolnym obiektem. Jak tablica w PHP:)
Dane na mapie można przeszukiwać według klucza.
Główna różnica między zestawem A Mapa polega na tym, że w zestawie wyszukujesz dane samodzielnie , podczas gdy na mapie za pomocą klucza.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-29 20:03:54
To proste: jeśli chcesz przechowywać wartości z mapowanymi do nich kluczami, przejdź do interfejsu Map, w przeciwnym razie użyj List dla wartości, które mogą być zduplikowane, a na koniec użyj interfejsu Set, jeśli nie chcesz zduplikowanych wartości w swojej kolekcji.
Oto pełne wyjaśnienie http://javatutorial.net/choose-the-right-java-collection , w tym SCHEMAT BLOKOWY itp
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-02 12:10:14