"Cześć, Amigo!"

"Cześć, Ellie!"

„Dzisiaj raz na zawsze zastanowimy się nad strukturą kolekcji”.

– Długo na to czekałem.

„Wiesz już, czym są kolekcje i wiesz, jak z nimi pracować. Czas uporządkować swoją wiedzę w ścisły system. Wtedy wiele pytań „dlaczego” i „jak” zniknie, a większość rzeczy stanie się oczywista”.

Interfejsy kolekcji . Struktura dziedziczenia interfejsów kolekcji wygląda mniej więcej tak:”

Interfejsy kolekcji — 1

Zauważ dwie rzeczy.

Po pierwsze, wszystko, co tu widzisz, to interfejs.

Po drugie, strzałki oznaczają „dziedziczy”.

„Innymi słowy, lista, zestaw i kolejka dziedziczą kolekcję, ale mapa nie?”

„Tak. Klasy abstrakcyjne dziedziczą te interfejsy, a z kolei implementacje, o których wiesz, dziedziczą te klasy abstrakcyjne:  ArrayList, Hashtable, TreeSet…

"Masz rację."

„Zobaczmy teraz, do czego służą metody tych interfejsów:”

Metody interfejsu Iterable<E> ::

Metody Opis
Iterator<T> iterator(); Zwraca obiekt iteratora.

– To nie wydaje się wystarczające.

„Cóż, tyle ich jest. To wszystko dla iteratorów. Nie będziemy ich teraz omawiać, ale wkrótce omówimy je szczegółowo”.

Metody kolekcji <E>: interfejs:

Metody Opis
boolean add(E e); Dodaje element do kolekcji
boolean addAll(Collection<? extends E> c); Dodaje elementy do kolekcji
void clear(); Usuwa wszystkie elementy z kolekcji
boolean contains(Object o); Sprawdza, czy kolekcja zawiera element.
boolean containsAll(Collection<?> c); Sprawdza, czy kolekcja zawiera elementy.
boolean equals(Object o); Sprawdza, czy kolekcje są równoważne
int hashCode(); Zwraca kod skrótu
boolean isEmpty(); Sprawdza, czy kolekcja jest pusta.
Iterator<E> iterator(); Zwraca obiekt iteratora
boolean remove(Object o); Usuwa element z kolekcji
boolean removeAll(Collection<?> c); Usuwa elementy z kolekcji
boolean retainAll(Collection<?> c); Usuwa wszystkie elementy, których nie ma w c
int size(); Zwraca rozmiar kolekcji
Object[] toArray(); Konwertuje kolekcję na tablicę
<T> T[] toArray(T[] a); Konwertuje kolekcję na tablicę

„Jestem tu już solidny we wszystkim. Użyłem połowy z tych metod i spotkałem drugą połowę”.

– Świetnie, w takim razie kontynuujmy.

Metody interfejsu  List<E>::

Metody Opis
void add(int index, E element); Dodaje elementy do środka kolekcji
boolean addAll(int index, Collection<? extends E> c); Dodaje elementy do kolekcji
E get(int index); Zwraca element według indeksu
int indexOf(Object o); Zwraca indeks (liczbę) elementu
int lastIndexOf(Object o); Zwraca indeks ostatniego elementu.
ListIterator<E> listIterator(); Zwraca iterator dla listy
ListIterator<E> listIterator(int index); Zwraca iterator dla listy
E remove(int index); Usuwa element według jego indeksu
E set(int index, E element); Ustawia nową wartość według indeksu
List<E> subList(int fromIndex, int toIndex); Zwraca podkolekcję

„Tu też nie ma nic radykalnie nowego. O kolekcjach wiem już prawie wszystko, z czego nie mogę się nie cieszyć”.

„Cóż, myślę, że mogę znaleźć coś, co cię zaskoczy. Ale kontynuujmy badanie interfejsów:”

Metody interfejsu Set<E> ::

Metody Opis
Żadnych metod

„Interfejs Set nie ma żadnych nowych metod — tylko te, które dziedziczy”.

„Tak, widziałem, że interfejs Interable również nie miał niczego.

„Z drugiej strony, mniej metod oznacza mniej do zapamiętania!”

„Twój afirmujący życie optymizm sprawia, że ​​jestem szczęśliwy”.

„Interfejs Set jest dziedziczony przez dwa interfejsy z metodami: SortedSet i NavigableSet. Ale nie będę ich omawiał, bo nigdy nie skończymy”.

„Zamiast tego pozwólcie, że przedstawię ogólny obraz klas i interfejsów opisujących kolekcje w Javie”.

„Przynieś to”.

„Więc trzymaj się mocno:”

Interfejsy kolekcji — 2

"Wow, to jest ogromne!"

„Cóż, to nie jest takie duże. Pamiętaj też, że klasy abstrakcyjne są całkowicie opcjonalne. Ale dobrze jest pamiętać, która klasa implementuje które interfejsy. To może się dość często przydać”.

„Och, chciałbym również zauważyć, że niektóre kolekcje są uważane za przestarzałe”.

— Które to są?

„Mówię o klasach Vector, Stack, Dictionary i Hashtable. Są to zsynchronizowane (bezpieczne wątkowo) wersje zwykłych kolekcji”.

„Ale Java dodała specjalną bibliotekę współbieżności z wieloma kolekcjami, do których nie tylko można uzyskać dostęp z innych wątków, ale także mają znacznie wydajniejszą implementację.  ConcurrentHashMap jest znacznie wydajniejszy niż Hashtable ”.

„Możesz używać kolekcji Vector, Stack, Dictionary i Hashtable, ale nie jest to zalecane”.

– Rozumiem, będę o tym pamiętał.

— Dzięki, Ellie!