Kolekcje w Javie oraz klasy narzędziowe z biblioteki java.util.Collections to bardzo potężne narzędzia do operowania na danych. Można stwierdzić za prawidłowe dobranie struktur danych oraz ich sposobów przechowywania, może bardzo zoptymalizować i przyśpieszyć działania programu. Czasami bardziej skutecznie niż „wysublimowane algorytmy i optymalizacje kodu”.

Przy używaniu kolekcji należy brać pod uwagę, nie tylko typ i zastosowanie danych, ale również ich wielkość. Jeżeli zastosujemy streamy z Javy 8 wraz z podziałem na wątki robocze do małego zbioru danych to otrzymamy mniejszą wydajność niż przy jednym wątku. Wynika to z tego, że podzielenie danych i utworzenie wątków przetwarzających, powtórne złączenie wyników zajmie więcej czasu niż praca w jednym wątku.

Warto pamiętać ze od Javy 5 kolekcje przyjmują obiekty sparametryzowane (Generyki). Ważne jest również w przypadku własnych obiektów które będą przechowywane w kolekcjach aby prawidłowo implementowały funkcję haszującą „hashCode()” oraz porównującą obiekty „equals ()”

Na start warto zapoznać się z najpopularniejszymi interfejsami z frameworka Collections:

Interfejs Duplikaty Uporządkowany Sortowany Opis
Collection TAK NIE NIE Podstawowy interfejs kolekcji
List TAK TAK NIE Lista danych. Dostęp za pomocą indeksu, wstawianie na określanej pozycji
Set NIE NIE/TAK* NIE/TAK* Zbiór danych. Dane nie są przechowywane na określonej pozycji.
Queue TAK TAK NIE Kolejka danych. Realizuje kolejki FILO i FIFO
Map NIE NIE/TAK* NIE/TAK* Słownik danych. Nie jest to do końca kolekcja, ale bardziej słownik danych, gdzie następuje mapowanie klucz->wartość.
Deque Rozszerzenie listy o obsługę kolejki dwukierunkowej
NavigableSet Rozszerzenie zbioru o wyszukiwanie i pobieranie elementów według wzorca
SortedList Rozszerzenie listy o sortowanie elementów
Spliterator Wprowadzony w Javie 8 interfejs do operacji równoległych na danych zawartych w kolekcji.
  • – w zależności od klasy implementującej dany interfejs

a później z klasami implementujący dany interfejs, oraz na co dane implementacje pozwalają:

Klasa Interfejs Porządkowany przez Sortowanie Duplikaty

Opis

ArrayList List Indeks Nie Tak Tablica o zmiennej długości. Szybki odczyt randomowy O(1), wolne wstawianie O(1) lub O(n), wolne usuwanie O(n)
LinkedList List Indeks Nie Tak Połączona lista obiektów. Wolny odczyt randomowy O(n), szybkie foreach O(1), szybkie wstawianie O(1), szybkie usuwanie O(1)
Vector* List Indeks Nie Tak Historyczna. Przechowywanie w tablicy, synchronizowana kolekcja danych.
HashMap Map Nie Nie Nie** Przechowywanie wynika z implementacji funkcji hashCode() klucza. Wstawianie ma złożoność O(1), pobranie elementu O(h/n)
LinkedHashMap Map Wstawianie Nie Nie** Kolejność danych zależna od kolejności wstawiania. Wstawianie O(1), pobranie O(1)
TreeMap Map Drzewo czerwono-czarne, zrównoważone Tak Nie** Dane posortowane według porządku naturalnego klucza. Klucz powinien implementować iterfejs Comparable. Pobranie, wstawianie, usuwanie złożoność O(log n)
Hashtable* Map Nie Nie Nie Historyczna, zamiast tego zaleca się używanie HashMap. Synchronizowana
HashSet Set Nie Nie Nie Dane umieszczone w tablicy haszującej. Wstawianie na podstawie funkcji haszującej. Dodanie oraz sprawdzenie czy istnieje złożoność O(1), pobranie następnego elementu O(n) lub O (h/n)
LinkedHashSet Set Wstawianie Nie Nie Dane umieszczone w tablicy haszującej i liście połączonej. Wstawianie, sprawdzenie, pobranie następnego złożoność O(1)
TreeSet Set Sortowanie, Drzewo czerwono-czarne Tak Nie Dane przechowywane w drzewie binarnym. Wstawianie, sprawdzenie, pobranie następnego złożoność O(log n)
EnumSet Set Nie Nie Nie Implementacja przy pomocy tablicy bitów. Wstawianie, sprawdzenie, pobranie następnego złożoność O(1)
PriorityQueue Queue Priorytet Tak Tak
ArrayDeque Deque Priorytet Nie Tak Implementacja podwójnej kolejki o dostępie od początku i końca kolejki
AbstractCollection Collection Abstrakcyjna klasa. Zawiera większość implementacji interfejsu Iterable, Collection
AbstractList List Abstrakcyjna klasa zawierająca implementację interfejsu List o dostępie randomowym.
AbstractQueue Queue Abstrakcyjna klasa zawierająca implementację interfejsu Queue
AbstractSequentialList List Abstrakcyjna klasa zawierająca implementację interfejsu List o dostępie sekwencyjnym.
    • stare, zalecane nie używanie **  – klucze nie mogą być duplikatami, wartości mogą się powtarzać

Przy pracy na kolekcjach w Javie nie można zapomnieć o metodach realizujących operacje na kolekcjach zawartych w java.util.Collections.

Metoda Parametry Zwraca

Opis

addAll Collection c, T … elements boolean Wstawia elementy do kolekcji. Zwraca true jeżeli wstawiono
asLifoQueue Deque c Queue Zwraca kolekcję jako kolejkę LIFO
binarySearch List list, T value, Comparator c int Wykonujesz przeszukiwanie binarne, zwraca -1 jeżeli nie znaleziono
checkedCollection Collection c, Class t Collection Zwraca kolekcję, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedList List c, Class t List checkedList   Zwraca listę, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedMap Map c, Class keyT, Class valueT Map   Zwraca mapę, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedNavigableMap NavigableMap nm, Class keyT, Class valueT NavigableMap Zwraca NavigableMap, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedNavigableSet NavigableSet ns, Class t NavigableSet Zwraca NavigableSet, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedQueue Queue q, Class t Queue Zwraca kolejkę, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedSet Set c, Class t Set   Zwraca set, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedSortedMap SortedMap c, Class keyT, Class valueT SortedMap Zwraca posortowaną mapę, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedSortedSet SortedSet c, Class t SortedSet checkedSortedSet Zwraca posortowany set, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
copy List list1, List list2 Kopiuje elementy listy: list2 do list1
disjoint Collection a, Collection b boolean Sprawdza czy kolekcje nie mają elementów wspólnych. Zwraca true jeżeli nie mają.
emptyEnumeration Enumeration Zwraca puste wyliczenie.
emptyIterator Iterator Zwraca pusty iterator.
emptyList List Zwraca pustą niemodyfikowalną (Final) listę.
emptyListIterator ListIterator Zwraca pusty iterator listy
emptyMap Map Zwraca pustą niemodyfikowalną (Final) mapę.
emptyNavigableMap NavigableMap Zwraca pusty niemodyfikowalny (Final) obiekt NavigableMap.
emptyNavigableSet NavigableSet Zwraca pusty niemodyfikowalny (Final) obiekt NavigableSet.
emptySet Set Zwraca pusty niemodyfikowalny (Final) obiekt Set.
emptySortedMap SortedMap Zwraca pusty niemodyfikowalny (Final) obiekt SortedMap.
emptySortedSet SortedSet Zwraca pusty niemodyfikowalny (Final) obiekt SortedSet.
enumeration Collection c Enumeration Zwraca wyliczenie dla kolekcji.
fill List list, T obj Wypełnia daną listę
frequency Collection c, Object obj int frequency Zwraca ilość wystąpień obiektu w kolekcji
indexOfSubList List list, List subList int Zwraca indeks pierwszego wystąpienia sublisty  lub –1 jeżeli nie znaleziono
lastIndexOfSubList List list, List subList int Zwraca indeks ostatniego wystąpienia sublisty  lub –1 jeżeli nie znaleziono
list Enumeration enum ArrayList Zwraca elementy wyliczenia
max Collection c, Comparator comp T Zwraca maksymalny obiekt
min Collection c, Comparator comp T Zwraca minimalny obiekt
nCopies int num, T obj List Zwraca num kopi objektu
newSetFromMap Map m Set Tworzy i zwraca zbiór na podstawie przekazanej mapy.
replaceAll List list, T old, T new boolean Wyszukuje wystąpienie obiektu i zamienia go. Zwraca true jeżeli znalazł chociaż jedno
reverse List list Odwraca listę
reverseOrder Comparator comp Comparator Zwraca odwrotny komparator do przekazanego.
rotate List list, int n Przesuwa elementy listy w prawo o n jednostek, w lewo n ma być ujemne
shuffle List list, Random r Wymiesza elementy listy
singleton T obj Set Zwraca obiekt jako niemodyfikowalny zbór.
singletonList T obj List Zwraca obiekt jako niemodyfikowalną listę.
singletonMap K k, V v Map Zwraca klucz i wartość jako niemodyfikowalną mapę.
sort List list > Sortuje elementy listy.
swap List list, int idx1, int idx2 Zamienia między sobą elementy listy o podanych indeksach.
synchronizedCollection  Collection c Collection Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedList  List list List Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedMap  Map m Map Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedNavigableMap  NavigableMap nm NavigableMap Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedNavigableSet  NavigableSet nm NavigableSet Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedSet  Set s Set synchronizedSet() Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedSortedMap  SortedMap sm SortedMap Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedSortedSet  SortedSet ss SortedSet Zwraca kolekcję bezpieczną dla wątków (threadsafe)
unmodifiableCollection  Collection c Collection Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableList List list List Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableMap Map m Map Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableNavigableMap  NavigableMap nm NavigableMap Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableNavigableSet Set s Set Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableSet Set s Set Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableSortedMap SortedMap sm SortedMap   Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableSortedSet  SortedSet ss SortedSet Zwraca niemodyfikowalną kolekcję tylko do odczytu.

 

Przykłady