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ć?

Author: Community, 2014-02-24

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.

Tutaj wpisz opis obrazka

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?

 218
Author: Tim B,
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ący Collection bez duplikatów.
    • HashSet: A Set Hashtable. Najszybsze i najmniejsze zużycie pamięci, przy zamawianiu jest nieważne.
    • LinkedHashSet: a HashSet z dodaniem listy połączonej do elementów powiązanych w porządku wstawiania. Element" następny " jest kolejnym-ostatnio wstawionym elementem.
    • TreeSet: A Set gdzie elementy są uporządkowane przez Comparator (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 wydajny Set dostosowany do pojedynczego typu enum.
  • List: interfejs reprezentujący Collection, 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: a List 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żywa System.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 zamiast LinkedList.
    • LinkedList: a List wspierane przez zbiór obiektów, z których każdy jest powiązany z" poprzednimi "i" kolejnymi " sąsiadami. A LinkedList to także Queue i Deque. 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ący Collection, gdzie każdy element ma identyfikujący "klucz" - każdy element jest parą klucz-wartość.
    • HashMap: a Map gdzie klucze nie są uporządkowane i wspierane przez Hashtable.
    • LinkedhashMap: klucze są uporządkowane według w kolejności wstawiania .
    • TreeMap: a Map, gdzie klucze są uporządkowane przez a Comparator (zazwyczaj naturalna kolejność).
  • Queue: interfejs, który reprezentuje Collection, gdzie elementy są zazwyczaj dodawane na jednym końcu i usuwane z drugiego (FIFO: first-in, first-out).
  • Stack: interfejs, który reprezentuje Collection , 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:

diagram

Porównując wstawianie elementu z ArrayList i LinkedList:

diagram

 46
Author: aliteralmind,
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!

  1. Zbiór to wszystko, co zawiera dane zwane "elementami" (tego samego typu). Nie przyjmuje się nic bardziej szczegółowego.

  2. Lista jest zindeksowanym zbiorem danych, gdzie każdy element ma indeks. Coś jak tablica, ale bardziej elastyczne.

    Dane na liście zachowują kolejność wstawiania.

  3. 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.

  4. 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.

 9
Author: Honza Zidek,
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

 1
Author: filip_j,
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