Collections Framework
Collections Framework (CF) to zestaw interfejsów, klas i algorytmów udostępnionych w języku Java, które ułatwiają przechowywanie, przetwarzanie i manipulację zbiorami danych. Framework został wprowadzony w wersji Java 2 (JDK 1.2) i od tego czasu stanowi podstawowy element bibliotek standardowych.
Podstawowe pojęcia
CF opiera się na kilku kluczowych elementach:
- Interfejsy kolekcji (Collection, List, Set, Map, Queue) definiujące operacje dostępne dla różnych typów zbiorów.
- Klasy implementujące te interfejsy, takie jak ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap i inne.
- Algorytmy udostępnione w klasie Collections, które działają na dowolnych obiektach implementujących odpowiednie interfejsy (np. sortowanie, wyszukiwanie, kopiowanie).
- Iteratory (Iterator, ListIterator) umożliwiające sekwencyjny dostęp do elementów kolekcji bez ujawniania jej wewnętrznej struktury.
Hierarchia interfejsów
Główna hierarchia CF wygląda następująco:
java.util.Collection
├─ java.util.List
│ ├─ java.util.ArrayList
│ └─ java.util.LinkedList
├─ java.util.Set
│ ├─ java.util.HashSet
│ └─ java.util.TreeSet
└─ java.util.Queue
└─ java.util.PriorityQueue
Oddzielnym drzewem jest Map, które nie dziedziczy po Collection, ale posiada własną hierarchię:
java.util.Map
├─ java.util.HashMap
├─ java.util.LinkedHashMap
└─ java.util.TreeMap
Klasy pomocnicze
Klasa Collections zawiera statyczne metody operujące na kolekcjach, m.in.:
sort(List<T> list)– sortowanie listy według naturalnego porządku lub podanego Comparator.binarySearch(List<T> list, T key)– wyszukiwanie binarne w posortowanej liście.shuffle(List<?> list)– losowe przetasowanie elementów.reverse(List<?> list)– odwrócenie kolejności.unmodifiableCollection(Collection<?> c)– tworzenie niezmiennych widoków.
Wydajność i wybór implementacji
Wybór konkretnej klasy zależy od wymagań dotyczących:
- Czasu dostępu do elementów – ArrayList oferuje O(1) dostęp indeksowy, natomiast LinkedList zapewnia O(1) wstawianie i usuwanie na początku i końcu.
- Unikalności elementów – Set (np. HashSet) gwarantuje brak duplikatów.
- Kolejności – TreeSet i TreeMap utrzymują elementy w uporządkowanej kolejności (logarytmiczny dostęp).
- Wsparcia dla wielowątkowości – klasy z pakietu java.util.concurrent (np. ConcurrentHashMap) oferują thread‑safe operacje.
Przykładowe użycie
import java.util.*;
public class PrzykladCF {
public static void main(String[] args) {
// Lista dynamiczna
List<String> lista = new ArrayList<>();
lista.add("jabłko");
lista.add("banan");
lista.add("czereśnia");
// Sortowanie
Collections.sort(lista);
System.out.println("Posortowana lista: " + lista);
// Zbiór unikalnych elementów
Set<String> zbior = new HashSet<>(lista);
zbior.add("banan"); // duplikat nie zostanie dodany
System.out.println("Zbiór: " + zbior);
// Mapa klucz‑wartość
Map<String, Integer> mapa = new HashMap<>();
mapa.put("jeden", 1);
mapa.put("dwa", 2);
mapa.put("trzy", 3);
System.out.println("Mapa: " + mapa);
}
}
Powyższy kod demonstruje podstawowe operacje – tworzenie, modyfikację i przetwarzanie kolekcji przy użyciu elementów z Collections Framework.
Rozszerzenia i alternatywy
Od Javy 8 wprowadzono Stream API, które umożliwia deklaratywne przetwarzanie danych z kolekcji (filtracja, mapowanie, redukcja). Biblioteki trzecich stron, takie jak Guava czy Apache Commons Collections, oferują dodatkowe struktury i narzędzia, ale opierają się na standardowym CF.
Historia
Pierwsze próby standaryzacji struktur danych w Javie pojawiły się w latach 1995–1998. Projekt Collections Framework został opracowany pod kierownictwem Josh Block i Neal Gafter. Oficjalna publikacja nastąpiła wraz z wydaniem J2SE 1.2 w 1998 roku.
Powiązane pojęcia
- Generics – wprowadzone w JDK 5, umożliwiające typowanie kolekcji.
- Iterator i ListIterator – standardowe mechanizmy iteracji.
- ConcurrentModificationException – wyjątek pojawiający się przy modyfikacji kolekcji w trakcie iteracji.
- java.util.concurrent – pakiet rozszerzający CF o klasy bezpieczne w środowisku wielowątkowym.
Collections Framework pozostaje jednym z najważniejszych elementów platformy Java, zapewniając spójną, wydajną i łatwą w użyciu infrastrukturę do pracy z danymi.