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
Możliwość komentowania jest wyłączona.