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<E>, Collection<E>
AbstractList List Abstrakcyjna klasa zawierająca implementację interfejsu List<E> o dostępie randomowym.
AbstractQueue Queue Abstrakcyjna klasa zawierająca implementację interfejsu Queue<E>
AbstractSequentialList List Abstrakcyjna klasa zawierająca implementację interfejsu List<E> 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<? super T> c,

T … elements

boolean Wstawia elementy do kolekcji. Zwraca true jeżeli wstawiono
asLifoQueue Deque<T> c Queue<T> Zwraca kolekcję jako kolejkę LIFO
binarySearch List<? extends T> list,

T value, Comparator<? super T> c

int Wykonujesz przeszukiwanie binarne, zwraca -1 jeżeli nie znaleziono
checkedCollection Collection<E> c, Class<E> t Collection<E> Zwraca kolekcję, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedList List<E> c, Class<E> t List<E> checkedList

 

Zwraca listę, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedMap Map<K, V> c,

Class<K> keyT,

Class<V> valueT

Map<K, V>

 

Zwraca mapę, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedNavigableMap NavigableMap<K, V> nm,

Class<E> keyT,

Class<V> valueT

NavigableMap<K, V> Zwraca NavigableMap, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedNavigableSet NavigableSet<E> ns,

Class<E> t

NavigableSet<E> Zwraca NavigableSet, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedQueue Queue<E> q,

Class<E> t

Queue<E> Zwraca kolejkę, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedSet Set<E> c, Class<E> t Set<E>

 

Zwraca set, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedSortedMap SortedMap<K, V> c, Class<K>

keyT, Class<V> valueT

SortedMap<K, V> Zwraca posortowaną mapę, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
checkedSortedSet SortedSet<E> c, Class<E> t SortedSet<E>
checkedSortedSet
Zwraca posortowany set, gdzie wstawienie obiektu niegodnego typu generuje wyjątek ClassCastException
copy List<? super T> list1, List<? extends T> 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<T> Zwraca puste wyliczenie.
emptyIterator Iterator<T> Zwraca pusty iterator.
emptyList List<T> Zwraca pustą niemodyfikowalną (Final) listę.
emptyListIterator ListIterator<T> Zwraca pusty iterator listy
emptyMap Map<K, V> Zwraca pustą niemodyfikowalną (Final) mapę.
emptyNavigableMap NavigableMap<K, V> Zwraca pusty niemodyfikowalny (Final) obiekt NavigableMap.
emptyNavigableSet NavigableSet<E> Zwraca pusty niemodyfikowalny (Final) obiekt NavigableSet.
emptySet Set<T> Zwraca pusty niemodyfikowalny (Final) obiekt Set.
emptySortedMap SortedMap<K, V> Zwraca pusty niemodyfikowalny (Final) obiekt SortedMap.
emptySortedSet SortedSet<E> Zwraca pusty niemodyfikowalny (Final) obiekt SortedSet.
enumeration Collection<T> c Enumeration<T> Zwraca wyliczenie dla kolekcji.
fill List<? super T> 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<T> enum ArrayList<T> Zwraca elementy wyliczenia
max Collection<? extends T> c, Comparator<? super T> comp T Zwraca maksymalny obiekt
min Collection<? extends T> c,

Comparator<? super T> comp

T Zwraca minimalny obiekt
nCopies int num, T obj List<T> Zwraca num kopi objektu
newSetFromMap Map<E, Boolean> m Set<E> Tworzy i zwraca zbiór na podstawie przekazanej mapy.
replaceAll List<T> list, T old, T new boolean Wyszukuje wystąpienie obiektu i zamienia go. Zwraca true jeżeli znalazł chociaż jedno
reverse List<T> list Odwraca listę
reverseOrder Comparator<T> comp Comparator<T> Zwraca odwrotny komparator do przekazanego.
rotate List<T> list, int n Przesuwa elementy listy w prawo o n jednostek, w lewo n ma być ujemne
shuffle List<T> list, Random r Wymiesza elementy listy
singleton T obj Set<T> Zwraca obiekt jako niemodyfikowalny zbór.
singletonList T obj List<T> Zwraca obiekt jako niemodyfikowalną listę.
singletonMap K k, V v Map<K, V> Zwraca klucz i wartość jako niemodyfikowalną mapę.
sort List<T> list <T extends Comparable<? super T>> Sortuje elementy listy.
swap List<T> list, int idx1, int idx2 Zamienia między sobą elementy listy o podanych indeksach.
synchronizedCollection  Collection<T> c Collection<T> Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedList  List<T> list List<T> Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedMap  Map<K, V> m Map<K, V> Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedNavigableMap  NavigableMap<K, V> nm NavigableMap<K, V> Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedNavigableSet  NavigableSet<T> nm NavigableSet<T> Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedSet  Set<T> s Set<T> synchronizedSet() Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedSortedMap  SortedMap<K, V> sm SortedMap<K, V> Zwraca kolekcję bezpieczną dla wątków (threadsafe)
synchronizedSortedSet  SortedSet<T> ss SortedSet<T> Zwraca kolekcję bezpieczną dla wątków (threadsafe)
unmodifiableCollection  Collection<? extends T> c Collection<T> Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableList List<? extends T> list List<T> Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableMap Map<? extends K, ? extends V> m Map<K, V> Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableNavigableMap  NavigableMap<K, V> nm NavigableMap<K, V> Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableNavigableSet Set<? extends T> s Set<T> Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableSet Set<? extends T> s Set<T> Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableSortedMap SortedMap<? extends K,

? extends V> sm

SortedMap<K, V>

 

Zwraca niemodyfikowalną kolekcję tylko do odczytu.
unmodifiableSortedSet  SortedSet<? extends T> ss SortedSet<T> Zwraca niemodyfikowalną kolekcję tylko do odczytu.

 

Przykłady