Kolekcje

Kolekcje
Wprowadzone w javie od wersji 1.2 struktury danych pomagające rozwiązać problem np. z implementacją „rozszerzalnej tablicy”.

  • Podstawowe kolekcje w javie to:
  • listy (list)
  • zbiory (set)
  • mapy (map)
  • kolejki (queue)

Poszczególnym typom powyższych kolekcji odpowiadają interfejsy List, Set oraz Map. Wszystkie one od javy 1.5 są generyczne(możemy określić jaki typ obiektów mogą przechowywać) oraz nie mogą przechowywać typów prostych.

Listy (list)
To uporządkowane kolekcje obiektów, które są numerowane za pomocą indeksów.

ArrayList (lista tablicowa)
Lista bazująca na tablicy. Domyślny rozmiar to 10 (można go zmienić w konstruktorze).
Cechy:
Duża szybkość odczytu danych + wstawiania elementu na koniec listy.
Usuwanie lub wstawianie elementów do środka listy wiąże się ze spadkiem wydajności.

Deklaracja ArrayList

ArrayList<Typ_Obiektowy> nazwaListy = new ArrayList<>(opcjonalny_domyślny_rozmiar);

 

Metody
add(E e) – dodaje element zgodny z zadeklarowanym typem generycznym do kolekcji. Pozwala na dodawanie wartości null oraz powtarzających się elementów
addAll(Collection c) – dodaje wszystkie elementy z innej kolekcji do listy (kopie referencji)
clear() – usuwa wszystkie elementy z listy
get(int index) – zwraca element pod podanym indeksem. Podobnie jak przy tablicach indeksowanie jest od 0. Metoda może generować wyjątek ArrayIndexOutOfBoundsException
remove(int index) – usuwa element z indeksu podanego jako parametr
remove(Object o) – usuwa pierwsze wystąpienie obiektu, dla którego metoda equals() zwróci true
sort(Comparator c) – sortuje listę zgodnie z podanym komparatorem
size() – zwraca rozmiar listy. Działanie analogiczne do właściwości length tablicy
(pełną listę metod znajdziesz w dokumentacji)

 

Lists.java

import java.util.ArrayList;</pre>
public class Lists {
public static void main(String[] args) {
ArrayList<Integer> ints = new ArrayList<>();

for(int i=0; i<100; i++) {
ints.add(i);
}

System.out.println("ints.get(50) = " + ints.get(50));
System.out.println("Ilość elementów na liście: " + ints.size());
System.out.println("Czyszczę tablicę: ");
ints.clear();
System.out.println("Ilość elementów na liście: " + ints.size());
}
}

 

LinkedList (lista wiązana)
Jej charakterystyczną cechą jest to że każdy element przechowuje informację tylko do elementu poprzedzającego oraz do swojego następnika.

Cechy
Odczyt danych szczególnie ze środka listy nie jest zbyt wydajny
Szybsze niż w przypadku ArrayList wstawianie/usuwanie elementów z listy.

Metody
Poza metodami opisanymi już przy okazji listy tablicowej, lista wiązana posiada swoje własne:
addFirst(E e) / removeFirst() – dodanie lub usunięcie elementu z początku listy
addLast(E e) / removeLast() – dodanie lub usunięcie elementu z końca listy

Deklaracja
Analogicznie do ArrayList:

LinkedList<Integer> ints = new LinkedList<>();

 

Zbiory (set)
Są to (zgodnie z matematyczną definicją) kolekcje unikalnych obiektów. Nie można do nich dodać wartości null.
Warto ich używać w sytuacji gdy chcemy mieć pewność że przechowujemy tylko unikalne obiekty.
Najczęściej wykorzystuje się je wtedy, kiedy nie obchodzi nas kolejność dodawania obiektów i odwoływanie się do nich po indeksach, ani iterowanie po całym zbiorze, ale liczy się dla nas szybkie dodawanie, usuwanie i wyszukiwanie wartości

TreeSet
Wewnętrzną reprezentacją tego zbioru w javie jest drzewo czerwono-czarne, elementy w nim zawarte są sortowane według naturalnego porządku (lub za pomocą zdefiniowanego komparatora).

Metody
add(E e) – dodaje do zbioru obiekt, który jest zgodny ze typem zbioru
contains(E e) – sprawdza, czy w zbiorze znajduje się podany jako argument element
remove(E e) – usuwa ze zbioru element podany jako argument
size() – zwraca ilość elementów w tym zbiorze
first() / last() – zwraca pierwszy lub ostatni element zbioru (zgodny z porządkiem sortowania)

W celu iterowania po elementach TreeSet należy skorzystać z obiektu iteratora, lub skorzystać z pętli for-each.

Deklaracja

TreeSet<Integer> set = new TreeSet<>();

 

HashSet
To nieposortowany i nieuporządkowany zbiór, jego główną zaletą jest wysoka wydajność przy dodawaniu/usuwaniu/wyszukiwaniu elementów. Pozwala na umieszczanie wartości null.

By przechowywać elementy w takim zbiorze konieczne jest zdefiniowanie metody hashCode().

Deklaracja

HashSet<Person> persons = new HashSet<>();

LinkedHashSet
Zbiór bardzo podobny do HashSet jednak dzięki dodatkowej wewnętrznej reprezentacji w postaci listy wiązanej, dodając kolejne elementy do zbioru uzyskujemy pewność, że w tej samej kolejności będziemy mogli po nich iterować. W przypadku zwykłego HashSet iteracja odbywa się w przypadkowej kolejności.

Mapy
Kolekcje przechowujące dane na zasadzie klucz-wartość (oba elementy muszą być obiektami), gdzie klucz jest unikalnym identyfikatorem pozwalającym wyszukać wartość. Służą głównie do wygodnego wyszukiwania danych po ustalonym kluczu.

HashMap
Jedna z najczęsciej używanych map, parametryzowana dwoma parametrami <K, V> (K – key, V – value). Elementy w takiej mapie są w przypadkowej i nieposortowanej kolejności. Wymagane jest zaimplementowanie metody hashCode(). Do takiej mapy możemy dodać jeden obiekt o kluczu pustym (null) oraz wiele wartości pustych, ale z unikalnymi kluczami.

Metody
put(K key, V value) – wstawia obiekt value typu V do zbioru i pozwala go odnaleźć pod kluczem key typu K
get(K key) – zwraca obiekt o kluczu key typu K
keySet() – zwraca zbiór wszystkich kluczy w mapie
values() – zwraca kolekcję wszystkich wartości (obiektów) przechowywanych w mapie
remove(Object key) – usuwa element mapy, dla którego klucza podanego jako parametr
entrySet() – zwraca zbiór obiektów w postaci klucz-wartość, reprezentowanych przez klasę Map.Entry<K,V>
clear() – czyści mapę ze wszystkiem przechowywanych danych

Deklaracja

Map<String, Notebook> notebooks = new HashMap<>();

LinkedHashMap
W odróżnieniu od zwykłej hasMapy zachowuje kolejność dodawanych elementów co może być przydatne gdy zechcemy po nich iterować.

TreeMap
Podobnie jak w przypadku zbioru typu TreeSet mapa typu TreeMap różni się od standardowego HashMap tym, że obiekty są w niej sortowane zgodnie z naturalnym porządkiem kluczy lub zgodnie z komparatorem przekazanym w konstruktorze.

Kolejki
Specyficzny typ listy (first in, first out).

Klasy reprezentujące kolejki:

  • LinkedList
  • PriorityQueue

Metody
offer(E e) – dodaje do kolejki element zgodny z zadeklarowanym typem generycznym
peek() – pobiera element z kolejki, ale go nie usuwa
poll() – pobiera element z kolejki i go z niej usuwa. Zwraca null, gdy kolejka jest pusta

Deklaracja

LinkedList<Typ> queue = new LinkedList<>();
PriorityQueue<Typ> queue = new PriorityQueue<>();

lub lepiej

Queue<Typ> queue = new LinkedList<>();
Queue<Typ> queue = new PriorityQueue<>();

Deklaracja typu bardziej abstrakcyjnego daje nam większą elastyczność w przyszłości.

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *