Download as pdf or txt
Download as pdf or txt
You are on page 1of 38

Bartosz Walter

Zaawansowane projektowanie obiektowe

Kolekcje w jzyku Java

Prowadzcy: Bartosz Walter

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

Plan wykadu

Historia Java Collections Podstawowe interfejsy i ich odpowiedzialno Iteratory Klasy pomocnicze i ich funkcjonalno Obiekty opakowujce Porwnywanie obiektw Typy generyczne

Biblioteka Java Collections (2)

Podczas wykadu zostanie zaprezentowana biblioteka Java Collections. Stanowi ona przykad ewolucji biblioteki obiektowej wraz z pojawiajcymi si nowymi elementami jzyka. Spord innych bibliotek wyrnia j wysoka jako projektu oraz dobr zastosowanych rozwiza. Omwiona zostanie pokrtce historia ewolucji tej biblioteki i wprowadzane do niej w kolejnych wersjach zmiany. Nastpnie przedstawione bd podstawowe interfejsy wchodzce w skad biblioteki, ich odpowiedzialno oraz konwencje i ograniczenia, jakie nakadaj. Potem zaprezentowane zostan iteratory stanowice abstrakcyjny mechanizm dostpu do elementw kolekcji i ich implementacja w tej bibliotece. Tematem kolejnej czci wykadu bd klasy pomocnicze, zawierajce metody, ktre nie nale do adnego typu kolekcji, a pozwalajce na wykonywanie na nich pewnych wsplnych operacji. Na szczegln uwag zasuguje koncepcja obiektw opakowujcych, ktre pozwalaj dynamicznie zmienia zachowanie klasy. Ostatnim zagadnieniem bd typy generyczne wprowadzone do jzyka Java w wersji 5.0 i ich zastosowania.

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

Historia

1995: JDK 1.0 niezalene klasy kolekcji: tablice Vector, Hashtable o niespjnym sposobie dostpu do elementw brak wydzielonych interfejsw 1998: JDK 1.2 oparcie kolekcji na interfejsach Collection, Set, List i Map oraz rnorodnych implementacjach iteratory, algorytmy, porwnania 2005: JDK 1.5 wprowadzenie typw generycznych

Biblioteka Java Collections (3)

Kolekcje s obecne w JDK od pocztku istnienia Javy. Jednak, wydana w roku 1995 wersja 1.0 zawieraa zestaw kilku sabo zwizanych ze sob klas, ktre reprezentoway rne rodzaje kolekcji: prost tablic lub klas Vector (jako list), Hashtable (jako tablic asocjacyjn). Klasy te byy gotowymi implementacjami o sfinalizowanych metodach (co utrudniao ich rozszerzanie), brakowao abstrakcyjnych interfejsw, ktre pozwoliyby lepiej modularyzowa kod i hermetyzowa jego funkcjonalno. Dlatego w wersji 1.2 JDK pojawia si zaprojektowana od nowa biblioteka Java Collections, ktra rozwizywaa wikszo istniejcych problemw. Wprowadzono nowe interfejsy, ktre tworzyy szkielet biblioteki: Collection, Set, List i Map, dziki czemu implementacje nie byy ze sob bezporednio zwizane. Dostp do elementw kolekcji zosta ujednolicony poprzez wprowadzenie interfejsu Iterator, implementowanego we wszystkich kolekcjach. Ponadto, w bibliotece zaimplementowano typowe algorytmy wyszukiwania, sortowania, a take wymienny mechanizm porwnywania obiektw. Kolejna dua zmiana wizaa si z wprowadzeniem do jzyka Java typw generycznych (ang. generic types). Pozwalaj one sprawdza w momencie kompilacji, czy typy obiektw s zgodne z deklaracj. Ma to ogromny wpyw przede wszystkim na kolekcje, ktre dotd przechowyway obiekty typu java.lang.Object, a wic "zapominay" o typach. Wraz z pojawieniem si typw generycznych moliwe stao si okrelenie typu elementw i weryfikacja w momencie kompilacji. Wprowadzane zmiany miay ogromny wpyw na projekt, funkcjonalno i sposb wykorzystania biblioteki Java Collections. Warto zauway, e biblioteka ta zachowaa jednak wsteczn zgodno z poprzednimi wersjami, co miao istotny wpyw na drogi jej ewolucji.

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

Interfejs java.util.Collection
<<create>> <<create>>

Iterator
(from util)

Collection
(from util)

Map
(from util)

<<create>> Queue
(from util)

TreeMap
(from util)

WeakHashMap
(from util)

HashMap
(from util)

ListIterator
(from util)

List
(from util)

Set
(from util)

Arrays
(from util)

Comparable
(from lang)

ArrayList
(from util)

LinkedList
(from util)

TreeSet
(from util)

HashSet
(from util)

Collections
(from util)

Comparator
(from util)

Biblioteka Java Collections (4)

Interfejs Collection stanowi podstaw projektu biblioteki Java Collections. Bezporednio dziedzicz po nim interfejsy List, Queue oraz Set, a intensywnie korzysta z niego interfejs Map. Kada kolekcja produkuje swj wasny obiekt o interfejsie Iterator. Pozostae klasy s implementacjami wymienionych interfejsw lub niezalenymi klasami pomocniczymi, blisko zwizanymi z kolekcjami.

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

Collection: specyfikacja
Wsplny interfejs dla wikszoci kolekcji Reprezentuje obiekt zarzdzajcy grup elementw Brak ogranicze dotyczcych elementw Dwa obligatoryjne konstruktory: bezparametrowy: Collection() kopiujcy: Collection(Collection src) Konstruktor zapewnia utworzenie obiektu zgodnego z semantyk danej kolekcji Metody nieobowizkowe mog zgasza wyjtek java.lang.UnsupportedOperationException Brak bezporedniej implementacji w JDK

Biblioteka Java Collections (5)

Z uwagi na rol interfejsu Collection, konieczne byo przyjcie zaoe dotyczcych jego semantyki, konwencji nazewniczych i projektowych. Collection, jako najoglniejszy typ kolekcji, nakada najmniejsze ograniczenia na przechowywane w nim elementy: specyfikacja mwi, e przechowuje on po prostu grup elementw; z tego wzgldu szczegowe decyzje, dotyczce uporzdkowania elementw, duplikatw, dostpu do elementw etc. s podejmowane w dziedziczcych interfejsach lub bezporednio w implementacjach. Na szczegln uwag zasuguje niesprawdzany wyjtek java.lang.UnsupportedOperationException, ktry jest zgaszany, gdy implementacja interfejsu, mimo syntaktycznej koniecznoci zdefiniowania metody, nie chce jej obsugiwa. W ten sposb, unikajc zubaania interfejsu Collection, obsugiwane s szczeglne wypadki, w ktrych konkretna kolekcja celowo jest pozbawiona pewnej funkcjonalnoci Interfejs ten nie posiada bezporedniej implementacji, tzn. nie istnieje w JDK klasa, ktra implementowaaby tylko ten interfejs. Jednak s struktury danych, ktre mona stworzy wanie w ten sposb, np. multizbir. Jednak dziki temu wszystkie kolekcje s do pewnego stopnia ze sob zgodne. Przyjto te konwencj, e kada kolekcja posiada dwa konstruktory: bezparametrowy, tworzcy pust kolekcj oraz kopiujcy, ktry zapamituje w nowej kolekcji wszystkie elementy nalece do starej. Konwencja ta jest stosowana dla wszystkich klas potomnych tego interfejsu: list, zbiorw i kolejek.

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

Collection: przegld wybranych metod

operacje podstawowe wykonywane na obiektach


boolean add(Object obj) boolean remove(Object obj) boolean contains(Object obj) boolean addAll(Collection coll) boolean removeAll(Collection coll) boolean containsAll(Collection coll) boolean retainAll(Collection coll) void clear()

operacje grupowe wykonywane na kolekcjach obiektw

Biblioteka Java Collections (6)

Interfejs Collection definiuje tylko te metody, ktre mog by zaimplementowane we wszystkich kolekcjach, bez wzgldu na ich semantyk. Posiada zatem zestaw metod sucych do operacji na pojedynczych obiektach (add(), remove() i contains()) oraz odpowiadajce im metody operujce na kolekcjach obiektw (addAll(), removeAll() i containsAll()). Warto zwracana przez te metody true lub false oznacza, czy metoda si powioda, czy nie. Poniewa interfejs Collection jest oglny, nie przesdza on o tym, jak poszczeglne metody si zachowuj. Np. w niektrych implementacjach niedopuszczajcych duplikatw elementw, metoda dodajca element zwraca warto false, jeeli nastpuje prba wstawienia duplikatu. W ten sposb w interfejsie przewidziano moliwo zastosowania w implementujcych go klasach rozwiza rnicych si semantyk.

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

Collection: przegld wybranych metod cd.

inspekcja
int size() boolean isEmpty(Object obj) Iterator iterator() Object[] toArray() Object[] toArray(Object[] type)

iteracja operacje na tablicach konwersja do tablic

Biblioteka Java Collections (7)

Warto zauway, e interfejs Collection nie definiuje sposobu dostpu do poszczeglnych elementw kolekcji. Dzieje si tak, poniewa kolekcja nie decyduje o sposobie organizacji elementw, a zatem nie mona stwierdzi, czy np. elementy mona indeksowa, jak w przypadku tablicy. Z drugiej strony, interfejs ten deklaruje metod iterator(), ktra zwraca obiekty typu Iterator. Pozwala on na sekwencyjny dostp do wszystkich elementw kolekcji, dziki czemu jest realizowany dostp do nich. Istnienie takiej metody nakada na wszystkie kolekcje obowizek zaimplementowania jej, tzn. e wszystkie pozwalaj na taki wanie dostp do elementw. Collection posiada take dwie metody suce jak interfejs umoliwiajcy utworzenie tablicy na podstawie kolekcji. Wersja metody toArray() z parametrem typu Object[] pozwala utworzy tablic okrelonego typu parametr suy wwczas jako prototyp zwracanej tablicy.

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

Interfejs java.util.List
<<create>> <<create>>

Iterator
(from util)

Collection
(from util)

Map
(from util)

<<create>> Queue
(from util)

TreeMap
(from util)

WeakHashMap
(from util)

HashMap
(from util)

ListIterator
(from util)

List
(from util)

Set
(from util)

Arrays
(from util)

Comparable
(from lang)

ArrayList
(from util)

LinkedList
(from util)

TreeSet
(from util)

HashSet
(from util)

Collections
(from util)

Comparator
(from util)

Biblioteka Java Collections (8)

Najprostszym rodzajem kolekcji jest lista. W przeciwiestwie do interfejsu Collection, narzuca ona pewne ograniczenia i definiuje znacznie bardziej szczegow semantyk.

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

List: specyfikacja

Reprezentacja uporzdkowanej sekwencji elementw Wikszo implementacji dopuszcza istnienie duplikatw elementw Najwaniejsze implementacje: ArrayList, LinkedList, Vector, Stack
wycinek 4-6 0 Ala ma 1 kota 2 a kot ma Al 6

dugo: 7
Biblioteka Java Collections (9)

Lista reprezentuje uporzdkowan kolekcj, tzn. tak, w ktrej elementom mona przypisa kolejne liczby. Interfejs ten nie decyduje o moliwoci przechowywania duplikatw, ale wszystkie implementacje znajdujce si w JDK pozwalaj na ich istnienie. JDK posiada kilka implementacji tego interfejsu, ktre cakowicie rni si sposobem przechowywania elementw. Klasa ArrayList stosuje w tym celu tablic, ktra jest zwikszana w momencie przekroczenia jej maksymalnego rozmiaru. Klasa LinkedList jest klasyczn list czon, w ktrej kady element posiada referencj do nastpnika. Te dwie implementacje charakteryzuj si rn wydajnoci, ale mona stosowa je zamiennie. Z kolei klasa Vector jest przepisan na nowo wersj znan z JDK 1.0. Jest obecna w bibliotece Java Collections tylko ze wzgldu na potrzeb wstecznej zgodnoci.

Biblioteka Java Collections

Bartosz Walter

Zaawansowane projektowanie obiektowe

List: przegld wybranych metod


dostp pozycyjny do elementw
Object get(int indeks) Object set(int indeks) Object add(int indeks) Object remove(int indeks) int indexOf(Object obiekt) int lastIndexOf(Object obiekt) ListIterator listIterator() List subList(int poczatek, int koniec)
Biblioteka Java Collections (10)

wyszukiwanie

rozszerzona iteracja widok przedziaowy

Z semantyki interfejsu wynika funkcjonalno, jakiej powinien on dostarcza. Lista posiada wic metod get(), suc do pozycyjnego dostpu do elementw, metody set() i add(), ktre dodaj element do kolekcji i remove(), ktry go usuwa. Za kadym razem element jest identyfikowany poprzez pozycj na licie, a metody te zwracaj referencj do obiektu, do ktrego nastpuje odwoanie (w przypadku metod set() i add() jest to element, ktry znajdowa si na licie poprzednio; ponadto set() zmienia element na podanej pozycji na inny, a add() dodaje go, przesuwajc nastpne elementy). Ponadto istniej metody wyszukujce elementy, ktre odwracaj sposb dziaania metody get() znajduj pozycj elementu na podstawie referencji do niego. Lista, korzystajc ze swoich moliwoci, definiuje rozszerzon wersj iteratora. Warto zauway, e lista w ten sposb posiada dwa iteratory: odziedziczony z Collection oraz wasny, typu ListIterator.

Biblioteka Java Collections

10

Bartosz Walter

Zaawansowane projektowanie obiektowe

Interfejs java.util.Queue
<<create>> <<create>>

Iterator
(from util)

Collection
(from util)

Map
(from util)

<<create>> Queue
(from util)

TreeMap
(from util)

WeakHashMap
(from util)

HashMap
(from util)

ListIterator
(from util)

List
(from util)

Set
(from util)

Arrays
(from util)

Comparable
(from lang)

ArrayList
(from util)

LinkedList
(from util)

TreeSet
(from util)

HashSet
(from util)

Collections
(from util)

Comparator
(from util)

Biblioteka Java Collections (11)

Interfejs Queue jest stosunkowo nowym elementem biblioteki. Wprowadzono go, aby doprecyzowa rnice, jakie dziel listy od kolejek.

Biblioteka Java Collections

11

Bartosz Walter

Zaawansowane projektowanie obiektowe

Queue: specyfikacja

Bezporedni potomek interfejsu Collection Reprezentacja kolejki (LIFO, FIFO, priorytetowa) Podzia na pierwszy element (gow) i pozosta cz kolejki (ogon) Najwaniejsze implementacje: LinkedList, PriorityQueue
Ala ma kota a kot ma Al

gowa

ogon
Biblioteka Java Collections (12)

Interfejs ten reprezentuje kolejk klasyczn struktur danych, w ktrej wyrnione s dwa elementy: gowa (ang. head) pierwszy element, do ktrego mona si w kadej chwili odwoa, i ogon (ang. tail) kolejk bdc pozostaoci po odciciu gowy. Zmiana polega tutaj na innym sposobie dostpu: odwoania dotycz gowy, ktr mona odczyta i usun, natomiast dostp do ogona jest moliwy dopiero po usuniciu dotychczasowej gowy (gow staje si pierwszy element ogona). Posugiwanie si w kolejkach metodami zdefiniowanymi dla Collection wydaje si nieuzasadnione, jeeli metody maj swoje odpowiedniki w interfejsie Queue. Wida w ten sposb, e jest to nowy interfejs w JDK, ktry nie do koca odpowiada pierwotnym zaoeniom dotyczcym rozkadu odpowiedzialnoci poszczeglnych interfejsw i klas. W wikszoci przypadkw kolejki s skonstruowane w ten sam sposb do listy. Wskazuj na to istniejce w JDK implementacje, np. LinkedList, ktre jednoczenie implementuj interfejsy List i Queue. Dziki temu ten sam obiekt moe peni dwie rne role, w zalenoci od kontekstu.

Biblioteka Java Collections

12

Bartosz Walter

Zaawansowane projektowanie obiektowe

Queue: przegld metod

Metody niezalene od interfejsu Collection: dodawanie elementu


boolean offer(Object obiekt)

usuwanie elementu
Object remove() Object poll()

inspekcja
Object element() Object peek()
Biblioteka Java Collections (13)

Metody dodane w interfejsie Queue (w porwnaniu do interfejsu Collection) w zasadzie dubluj ich funkcjonalno, jednak pozwalaj posugiwa si tym obiektem jak kolejk. Metoda offer() wstawia obiekt do kolejki w miejscu zalenym od implementacji (FIFO, LIFO czy priorytetowa). Warto zwracana przez t metod wskazuje, czy operacja si powioda. Metody remove() i poll() usuwaj gow kolejki i zwracaj j. Gdy kolejka jest pusta, metoda remove() zgasza wyjtek, a poll() zwraca warto null. Podobnie zachowuj si metody element() i peek(), ktre udostpniaj gow kolejki, ale bez jej usuwania: w przypadku pustej kolejki pierwsza zgasza wyjtek, druga zwraca warto null.

Biblioteka Java Collections

13

Bartosz Walter

Zaawansowane projektowanie obiektowe

Przykad

public class Odliczanie { public static void main(String[] args) { int liczba = Integer.parseInt(args[0]); Queue kolejka = new LinkedList(); for (int i = liczba; i >= 0; i--) { kolejka.add(i); } while (!kolejka.isEmpty()) { System.out.println(kolejka.remove()); } } }

Biblioteka Java Collections (14)

Oto prosty przykad wykorzystania kolejek. Elementy przekazane z linii polece s wstawiane do kolejki, a nastpnie kolejka jest przetwarzana w ptli while: dopki kolejka nie jest pusta, jest usuwany z niej i wywietlany element stanowicy jej gow.

Biblioteka Java Collections

14

Bartosz Walter

Zaawansowane projektowanie obiektowe

Interfejs java.util.Set
<<create>> <<create>>

Iterator
(from util)

Collection
(from util)

Map
(from util)

<<create>> Queue
(from util)

TreeMap
(from util)

WeakHashMap
(from util)

HashMap
(from util)

ListIterator
(from util)

List
(from util)

Set
(from util)

Arrays
(from util)

Comparable
(from lang)

ArrayList
(from util)

LinkedList
(from util)

TreeSet
(from util)

HashSet
(from util)

Collections
(from util)

Comparator
(from util)

Biblioteka Java Collections (15)

Kolejnym interfejsem dziedziczcym po Collection jest zbir (java.util.Set).

Biblioteka Java Collections

15

Bartosz Walter

Zaawansowane projektowanie obiektowe

Set: specyfikacja

Reprezentacja zbioru matematycznego brak relacji porzdku wewntrz zbioru brak duplikatw Brak nowych metod w stosunku do Collection najwaniejsze implementacje: HashSet, TreeSet
ma Ala Al kota a kot

Biblioteka Java Collections (16)

Zbir posiada, odmienn ni lista, semantyk: nie zachowuje kolejnoci elementw, natomiast wyklucza istnienie duplikatw. O elemencie mona zatem powiedzie jedynie, czy naley do zbioru (w jednym egzemplarzu), czy nie. Co ciekawe, interfejs ten nie definiuje adnych nowych metod w porwnaniu do interfejsu Collection. Wynika to z faktu, e trudno wskaza funkcjonalno, ktra wyrniaaby zbir od kolekcji. Warto zada pytanie, dlaczego zatem do jego reprezentacji powoano specjalny interfejs? Ot wskazanie, e okrelony obiekt jest typu Set niesie informacj bardziej szczegow ni w przypadku zwykej kolekcji, dlatego zostao to podkrelone przez specjalny typ obiektu. Podobnie, jak w przypadku listy, zbir posiada w JDK kilka gotowych implementacji. Jedn z nich jest HashSet, w ktrym unikatowo elementw jest zapewniona przez zastosowanie tablicy asocjacyjnej; w przypadku klasy TreeSet rol tablicy peni drzewo dwukolorowe.

Biblioteka Java Collections

16

Bartosz Walter

Zaawansowane projektowanie obiektowe

Przykad

public class Duplikaty { public static void main(String args[]) { Set s = new HashSet(); for (int i = 0; i < args.length; i++) { if (! s.add(args[i])) System.out.println("Duplikat!"); } } }

Biblioteka Java Collections (17)

Na tym slajdzie przedstawiono przykadowe wykorzystanie zbiorw do eliminacji duplikatw. Dodawanie do zbioru elementu koczy si sukcesem tylko w przypadku, gdy element ten dotychczas w zbiorze nie istnia. W przeciwnym przypadku metoda add() zbioru zwraca warto false.

Biblioteka Java Collections

17

Bartosz Walter

Zaawansowane projektowanie obiektowe

Interfejs java.util.Map
<<create>> <<create>>

Iterator
(from util)

Collection
(from util)

Map
(from util)

<<create>> Queue
(from util)

TreeMap
(from util)

WeakHashMap
(from util)

HashMap
(from util)

ListIterator
(from util)

List
(from util)

Set
(from util)

Arrays
(from util)

Comparable
(from lang)

ArrayList
(from util)

LinkedList
(from util)

TreeSet
(from util)

HashSet
(from util)

Collections
(from util)

Comparator
(from util)

Biblioteka Java Collections (18)

Kolejnym wanym elementem biblioteki Java Collections jest interfejs Map. Nie jest on zwizany z interfejsem Collection przez dziedziczenie, poniewa zarwno jego kontrakt, jak i struktura s rne, natomiast jest z nim powizany innymi relacjami.

Biblioteka Java Collections

18

Bartosz Walter

Zaawansowane projektowanie obiektowe

Map: specyfikacja

Kolekcja jednoznacznych odwzorowa klucz-warto Klucze, wartoci i pary klucz-warto dostpne jako obiekty Collection Dwa obowizkowe konstruktory (analogicznie do kolekcji) Najwaniejsze implementacje: HashMap, TreeMap, SortedMap
"Ala" "kota" "Ola" "kot" klucze "Al" wartoci
Biblioteka Java Collections (19)

Mapa przechowuje nie pojedyncze elementy, ale pary klucz-warto. Pary te pozwalaj na jednoznaczne odwzorowanie klucza na warto, tzn. dla kadego klucza istnieje co najwyej jedna odpowiadajca mu warto. W ten sposb mapa nie jest bezporednio zwizana z interfejsem Collection, jednak pozwala na dostp do swoich skadowych traktowanych wanie jako instancje tego interfejsu. Istniej trzy widoki, udostpniajce zbir kluczy (keySet()), kolekcj wartoci (values()) i zbir par klucz-warto (entrySet()). Zatem kad map mona w razie potrzeby traktowa jak zwyk kolekcj. Mapy z zaoenia nie gwarantuj okrelonej kolejnoci elementw w adnym z tych widokw, cho mog zapewni to implementacje. Analogicznie, jak w przypadku kolekcji, mapy posiadaj dwa konwencjonalne konstruktory: bezparametrowy i kopiujcy; w przypadku tego drugiego parametrem jest inna mapa. JDK zawiera trzy implementacje map: HashMap, TreeMap i SortedMap. Ta ostatnia mapa dodatkowo wanie zapewnia porzdek wrd przechowywanych w mapie par klucz-warto.

Biblioteka Java Collections

19

Bartosz Walter

Zaawansowane projektowanie obiektowe

Map: przegld metod

operacje podstawowe
Object put(Object klucz, Object wartosc) Object get(Object klucz) Object remove(Object klucz) boolean containsKey(Object klucz) boolean containsValue(Object wartosc) void putAll(Map zrodlo) Set keySet() Collection values() Set entrySet()

operacje grupowe widoki-kolekcje

Biblioteka Java Collections (20)

Z uwagi na odmienn funkcjonalno oferowan przez map, wszystkie metody s zdefiniowane od nowa. W rd operacji podstawowych: metoda put() suy do wstawienia do mapy nowej pary klucz-warto, get() odczytanie wartoci zwizanej z danym kluczem, a remove() usunicie pary z podanym kluczem. Istniej osobne metody weryfikujce obecno danego klucza i wartoci.

Biblioteka Java Collections

20

Bartosz Walter

Zaawansowane projektowanie obiektowe

Przykad

public class Czestotliwosc { private static final Integer JEDEN = new Integer(1); public static void main(String args[]) { Map mapa = new HashMap(); for (int i=0; i<args.length; i++) { Integer czest = (Integer) mapa.get(args[i]); mapa.put(args[i], (czest == null ? JEDEN : new Integer(czest.intValue() + 1))); } System.out.println(mapa.size() + " rnych sw"); System.out.println(mapa); } }

Biblioteka Java Collections (21)

W tym przykadzie mapa suy do przechowywania informacji o czstotliwoci wystpie obiektw przekazanych jako parametry wywoania programu. W mapie kluczami s wyrazy, natomiast wartociami liczby wskazujce na czstotliwo. Kadorazowy odczyt wartoci zwizanej z wyrazem-kluczem moe da dwa wyniki: jeeli warto taka nie istnieje, to znaczy, e wczeniej takie odwoanie nie miao miejsca i obecna czstotliwo wynosi jeden. W przeciwnym przypadku, warto pochodzca z mapy jest traktowana jako liczba, ktra jest zwikszana o jeden. W obu przypadkach warto ta jest ponownie wprowadzana do mapy.

Biblioteka Java Collections

21

Bartosz Walter

Zaawansowane projektowanie obiektowe

Iteratory
<<create>> <<create>>

Iterator
(from util)

Collection
(from util)

Map
(from util)

<<create>> Queue
(from util)

TreeMap
(from util)

WeakHashMap
(from util)

HashMap
(from util)

ListIterator
(from util)

List
(from util)

Set
(from util)

Arrays
(from util)

Comparable
(from lang)

ArrayList
(from util)

LinkedList
(from util)

TreeSet
(from util)

HashSet
(from util)

Collections
(from util)

Comparator
(from util)

Biblioteka Java Collections (22)

Kilkukrotnie, podczas omawiania kolekcji i map, bya mowa o iteratorach. S one blisko zwizane z kolekcjami: kada kolekcja tworzy swoj wasn implementacj Iteratora.

Biblioteka Java Collections

22

Bartosz Walter

Zaawansowane projektowanie obiektowe

Iteratory: specyfikacja
Umoliwiaj sekwencyjny dostp do wszystkich elementw kolekcji niezalenie od jej implementacji Dwa rodzaje iteratorw java.util.Iterator istnieje w kadej kolekcji java.util.ListIterator istnieje tylko w listach, wykorzystuje jej rozszerzone moliwoci
ma Ala kot Al kolekcja a
Biblioteka Java Collections (23)

Iterator
biecy element: "Ala" nastpny elenent: "kot"

kota

Celem iteratora jest udostpnienie wszystkich elementw kolekcji w sposb niezaleny od samej kolekcji i jej implementacji. Dziki temu w bibliotece Java Collections wszystkie kolekcje mona przejrze w identyczny sposb. Iterator jest obiektem stanowym: zapamituje biecy element w kolekcji, a wywoanie okrelonej metody (w Javie jest to next()) powoduje przesunicie tego wskanika na kolejny element. Koniec kolekcji jest okrelany za pomoc metody hasNext(), ktra zwraca true tylko wwczas, gdy istnieje jeszcze nieodwiedzony element. Biblioteka zawiera dwa rodzaje iteratorw: zwyke, implementujce interfejs java.util.Iterator, ktre pozwalaj jedynie przeglda wszystkie elementy oraz usuwa biecy element, oraz listowe, implementujce interfejs java.util.ListIterator dziedziczcy po interfejsie Iterator. Ten ostatni posiada znacznie rozszerzone moliwoci, wynikajce z semantyki listy: sta kolejno dostpu do elementw, moliwo zmiany kierunku, a take dodawania elementw. Warto zwrci uwag, e o ile kady iterator ma moliwo usuwania biecego elementu kolekcji, o tyle tylko iteratory listowe mog dodawa elementy. Jest to wiadoma decyzja autorw: nie mona przewidzie konsekwencji dodawania elementw do kadej kolekcji poprzez iterator. W przypadku listy najprawdopodobniej obie metody (iterator() i listIterator()) zwracaj iteratory tego samego typu dziki korzystaniu z nich przez interfejsy ich funkcjonalno jest ograniczona tylko do specyfikacji interfejsu. Jest to ciekawy przykad hermetyzacji implementacji klasy przy uyciu interfejsu. Szczegowy opis funkcjonalnoci Iteratora zostanie przedstawiony podczas wykadu o wzorcach projektowych.

Biblioteka Java Collections

23

Bartosz Walter

Zaawansowane projektowanie obiektowe

Przykad

public class Iteracja { public static void main(String args[]) { Collection coll = new ArrayList(); for (int i = 0; i < args.length; i++) { coll.add(args[i]); } for (Iterator iter = coll.iterator(); iter.hasNext();) String element = (String) iter.next(); System.out.println("element = " + element); } } } > java Iteracja Ala ma kota element = Ala element = ma element = kota

Biblioteka Java Collections (24)

Przykad pokazuje sposb wykorzystania iteratora w ptli for. Jest to pewnego rodzaju idiom, ktry warto zapamita.

Biblioteka Java Collections

24

Bartosz Walter

Zaawansowane projektowanie obiektowe

Klasy pomocnicze
<<create>> <<create>>

Iterator
(from util)

Collection
(from util)

Map
(from util)

<<create>> Queue
(from util)

TreeMap
(from util)

WeakHashMap
(from util)

HashMap
(from util)

ListIterator
(from util)

List
(from util)

Set
(from util)

Arrays
(from util)

Comparable
(from lang)

ArrayList
(from util)

LinkedList
(from util)

TreeSet
(from util)

HashSet
(from util)

Collections
(from util)

Comparator
(from util)

Biblioteka Java Collections (25)

Nie caa funkcjonalno zwizana z kolekcjami jest zawarta w klasach je implementujcych. Cz znajduje si w klasach pomocniczych (w szczeglnoci w klasie java.util.Collections), ktre oferuj metody statyczne realizujce typowe funkcje. W ten sposb uniknito duplikacji kodu w implementacjach poszczeglnych interfejsw kolekcji

Biblioteka Java Collections

25

Bartosz Walter

Zaawansowane projektowanie obiektowe

Algorytmy

Metody statyczne klasy Collections implementuj typowe algorytmy wykonywane na kolekcjach: wyszukiwanie binarne sortowanie operacje algebraiczne na zbiorach odwracanie list permutacje list wyszukiwanie elementw max/min

Biblioteka Java Collections (26)

Za ich pomoc mona m.in. wyszuka metod poowienia element wewntrz listy posortowa list obliczy sum, cz wspln, rozczn i rnic dwch zbiorw obliczy dowoln permutacj listy wyszuka najwikszy i najmniejszy element listy Funkcjonalno ta jest zawarta poza kolekcjami, poniewa w bibliotece nie istnieje jedna klasa, po ktrej inne dziedzicz. Wybrano implementacj interfejsw, a nie dziedziczenie klas jako metod wizania kolekcji ze sob, dlatego, aby unikn koniecznoci dodawania tej samej funkcjonalnoci w kadej z nich, wyczono j do statycznych metod w osobnej klasie.

Biblioteka Java Collections

26

Bartosz Walter

Zaawansowane projektowanie obiektowe

Niezmienno kolekcji

Klasa Collections posiada take metody statyczne, pozwalajce zmienia wasnoci kolekcji, np. blokowa metody modyfikujce kolekcj Collection immutableCollection(Collection kol) List immutableList(List lista) Set immutableSet(Set zbior) Map immutableMap(Map mapa) Metody te w rzeczywistoci tworz obiekt opakowujcy kolekcj i przechwytujcy wywoania metod

Biblioteka Java Collections (27)

Jednym z ciekawszych rozwiza zastosowanych w klasie Collections jest moliwo uczynienia kolekcji niemodyfikowaln. Typowe rozwizanie polega na stworzeniu dedykowanej podklasy, ktra posiada zmodyfikowane waciwoci. Jednak w praktyce jest to rozwizanie nieakceptowalne: powoduje podwojenie liczby klas, w zasadzie nie wprowadzajc istotnych rnic. Ponadto, czsto zachodzi konieczno uniemoliwienia modyfikacji w czasie, gdy kolekcja ju istnieje. Zmiana klasy istniejcego obiektu jest jednak niemoliwa. Dlatego w bibliotece Java Collections zastosowano wzorzec projektowy Decorator: opakowanie istniejcego obiektu specjalnym obiektem tego samego typu, ktry zmieni zachowanie wybranych metod. W tym przypadku bdzie to zablokowanie wszystkich metod, ktre mog modyfikowa kolekcj. Pozostae metody s bezporednio delegowane do opakowanej kolekcji. Z punktu widzenia klienta zmiana nie jest widoczna: zarwno oryginalna kolekcja, jak i opakowanie s tego samego typu, inna jest tylko referencja do tego obiektu. Opakowanie, naturalnie, nie przechowuje kopii elementw kolekcji, a jedynie odwouje si do jej metod. Zastosowanie obiektw opakowujcych ma te t zalet, e mona jednoczenie uy kilku kolejnych opakowa jednoczenie. Warto zwrci uwag na sposb realizacji opakowania: metody opakowujce w klasie Collections przyjmuj, jako argument, kolekcj (list, zbir, map), a zwracaj tak sam kolekcj, ale w postaci opakowanej. Dziki temu wywoanie metody pozornie zmienia klas, do ktrej naley przekazany obiekt.

Biblioteka Java Collections

27

Bartosz Walter

Zaawansowane projektowanie obiektowe

Przykad
dekorator kolekcji

size()

kolekcja

add()

Kolekcja Collection jest "opakowana" w obiekt blokujcy niektre metody. Wywoania metody size() s przez obiekt opakowujcy delegowane do wewntrznej kolekcji, natomiast metody add() blokowane.

Biblioteka Java Collections (28)

Schemat dziaania tego rozwizania jest nastpujcy: kolekcja jest opakowana w specjalny obiekt, ktry blokuje metody modyfikujce kolekcj (np. metod add()), natomiast inne metody s delegowane do kolekcji.

Biblioteka Java Collections

28

Bartosz Walter

Zaawansowane projektowanie obiektowe

Inne klasy opakowujce

Analogicznie, w klasie Collections istniej inne metody tworzce specjalizowane obiekty opakowujce; nazwy metod s zgodne z konwencj i zale od interfejsu Interfejs synchronizedInterfejs(Interfejs i) zapewnia synchronizacj dostpu do interfejsu; wielowtkowy dostp powoduje zgoszenie wyjtku Interfejs checkedInterfejs(Interfejs i) zapewnia weryfikacj typu wstawianego elementu do kolekcji

Biblioteka Java Collections (29)

Podobne rozwizanie jest stosowane w celu implementacji take innych waciwoci: synchronizacji kolekcji (metody synchronizedCollection(), synchronizedList(), synchronizedSet() i synchronizedMap()), aby wewntrz niej mg operowa tylko jeden wtek weryfikacji typu elementw w momencie wstawiania ich do kolekcji (metody checkedCollection(), checkedList(), checkedSet() i checkedMap()), ktre uniemoliwia wstawienie elementu o typie innym od uprzednio zadeklarowanego

Biblioteka Java Collections

29

Bartosz Walter

Zaawansowane projektowanie obiektowe

Porwnywanie obiektw
<<create>> <<create>>

Iterator
(from util)

Collection
(from util)

Map
(from util)

<<create>> Queue
(from util)

TreeMap
(from util)

WeakHashMap
(from util)

HashMap
(from util)

ListIterator
(from util)

List
(from util)

Set
(from util)

Arrays
(from util)

Comparable
(from lang)

ArrayList
(from util)

LinkedList
(from util)

TreeSet
(from util)

HashSet
(from util)

Collections
(from util)

Comparator
(from util)

Biblioteka Java Collections (30)

Interfejsy te nie s bezporednio czci biblioteki Collections, jednak s wykorzystywane przez wiele jej elementw, dlatego s przedstawiane wanie w tym miejscu.

Biblioteka Java Collections

30

Bartosz Walter

Zaawansowane projektowanie obiektowe

Porwnywanie obiektw
Wiele algorytmw wykonywanych na kolekcjach (np. sortowanie, wyszukiwanie) wymaga zdefiniowania relacji czciowego porzdku Relacja porwnania jest intuicyjnie zdefiniowana dla liczb, ale nie dla obiektw Czy mona porwna obiekty rnych klas? Jak porwna dwie osoby? Porwnywalno jest wasnoci obiektu, ktr mona z niego wyczy Java Collections korzysta z dwch interfejsw sucych do porwnywania obiektw java.lang.Comparable java.util.Comparator
Biblioteka Java Collections (31)

Porwnywanie obiektw jest cile zwizane z przetwarzaniem kolekcji. Jest ono szczeglnie istotne m.in. w przypadku sortowania, wyszukiwania min/max elementu etc. Dla liczb oraz napisw relacja porzdku jest intuicyjna, cho nie jest ona jedyn moliw. Natomiast porwnywanie dowolnych obiektw nie jest ju proste: porwnania dwch obiektw klasy Osoba mona dokona na wiele sposobw: alfabetycznie wg nazwiska, wg daty urodzenia, wg pci, wg adresu zamieszkania, lub dowolnej kombinacji wymienionych kryteriw. Dlatego wprowadzono porwnywalno jako wasno obiektu, ktr mona zdefiniowa. W tym celu wprowadzono dwa interfejsy: java.lang.Comparable i java.util.Comparator, ktrych metody su do porwnywania obiektw. Implementujc te interfejsy, programista podaje kryterium porwnania.

Biblioteka Java Collections

31

Bartosz Walter

Zaawansowane projektowanie obiektowe

Interfejs Comparable

Jak posortowa list osb wg daty urodzenia? Collections.sort(people)


public class Person implements Comparable { private Date birthday; public Date getBirthday() { return birthday; } public int compareTo (Object obj) { String birthday = ((Person) obj).getBirthday(); return (this.birthday.compareTo(birthday)); } }
Biblioteka Java Collections (32)

Spord nich, interfejs Comparable jest w pewnym sensie bardziej intuicyjny: klasa, ktrej obiekty maj by porwnywalne, musi implementowa ten interfejs, tzn. zdefiniowa metod compareTo(). Jej argumentem jest obiekt, z ktrym biecy obiekt zostanie porwnany. W przypadku porwnania dat urodzenia z biecego obiektu i parametru s one odczytywane i zwracany jest wynik ich porwnania. Naley zwrci uwag, e metoda compareTo() jest przeciwsymetryczna, tzn. zamiana obiektu z podmiotem moe wpyn na jej wynik.

Biblioteka Java Collections

32

Bartosz Walter

Zaawansowane projektowanie obiektowe

Interfejs Comparable cd.

Jak posortowa list osb wg daty urodzenia? Collections.sort(people) Sortowanie jest moliwe tylko dla list zawierajcych obiekty implementujce interfejs java.lang.Comparable Comparable definiuje jedn metod, compareTo(Object o), ktra zwraca mniej ni 0 gdy jej parametr jest wikszy ni wasny obiekt 0 gdy jej parametr jest rwny wasnemu obiektowi wicej ni 0 gdy jej parametr jest mniejszy ni wasny obiekt
Biblioteka Java Collections (33)

Korzystanie z moliwoci porwnania obiektw klasy implementujcej interfejs java.util.Comparable nie wymaga wielu zabiegw. W szczeglnoci metoda sortujca zakada, e na licie znajduj si obiekty implementujce ten interfejs, dlatego nie jest wymagana zmiana wywoania metody. Metoda compareTo() okrela, czy biecy obiekt jest "mniejszy" od parametru metody (wynik > 0), "rwny" (wynik = 0) czy te "mniejszy" (wynik < 0)

Biblioteka Java Collections

33

Bartosz Walter

Zaawansowane projektowanie obiektowe

Interfejs Comparator

Interfejs Comparator oferuje podobn funkcjonalno jak Comparable, ale porwnuje ze sob dwa obiekty przekazane jako parametry Comparator definiuje jedn metod, compare (Object o1, Object o2), analogiczn do metody Comparable.compareTo(Object o) Comparator przekazywany jest jako parametr metod sortujcych, wyszukujcych etc. Collections.sort(people, comparator) Sortowanie z wykorzystaniem interfejsu Comparator jest moliwe dla dowolnych obiektw

Biblioteka Java Collections (34)

Drugim rozwizaniem jest zastosowanie interfejsu Comparator. Posiada on t sam semantyk co Comparable, jednak nie jest implementowany bezporednio w obiekcie, lecz jako niezalena klasa. Pozwala on porwnywa dwa obiekty przekazane jako parametry zdefiniowanej w nim metody compare(), dziki czemu m.in. nie jest konieczna rekompilacja klasy, ktra ma by porwnywalna. Sortowanie list obiektw z wykorzystaniem interfejsu Comparator wymaga przekazania obiektu klasy go implementujcej jako drugiego parametru metody sort().

Biblioteka Java Collections

34

Bartosz Walter

Zaawansowane projektowanie obiektowe

Przykad

public class BirthdayComparator implements Comparator{ public int compare (Object obj1, Object obj2) { Date birthday1 = ((Person) obj1).getBirthday(); Date birthday2 = ((Person) obj1).getBirthday(); return birthday1.compareTo(birthday2); } } Collections.sort(people, new BirthdayComparator());

Biblioteka Java Collections (35)

Comparator zastosowany w podanym wczeniej przykadzie odczytuje daty urodzenia osb przekazanych jako parametry metody compare(). Zwraca ona takie same wyniki, co metoda compareTo() z interfejsu Comparable. Sortowanie polega na przekazaniu utworzonej instancji obiektu implementujcego interfejs Comparator BirthdayComparator.

Biblioteka Java Collections

35

Bartosz Walter

Zaawansowane projektowanie obiektowe

Typy generyczne

Wprowadzone w Java 5.0 SE (a.k.a. JDK 1.5) Przykad polimorfizmu parametrycznego: typ obiektu zaley od parametru weryfikowanego w momencie uruchomienia, a nie kompilacji Weryfikacja typw obiektw w momencie kompilacji, potem typy s wymazywane (ang. erasure)
List<Person> lista = new ArrayList<Person>();

Biblioteka Java Collections (36)

Najnowsze zmiany wprowadzone w bibliotece Java Collections dotyczyy wykorzystania typw generycznych. Cecha ta pojawia si w jzyku w wersji 5.0 (dawniej 1.5) i bya jedn z najduej oczekiwanych zmian. Czciowo implementuje ona polimorfizm parametryczny: typ obiektu nie musi by ustalany w trakcie kompilacji; jest on parametrem ewaluowanym w momencie uruchamiania programu. Ze wzgldu na konieczno zapewnienia zgodnoci wstecz z poprzednimi wersjami jzyka, w Javie zastosowano weryfikacj tylko do momentu kompilacji; nastpnie informacja o typie jest wymazywana, i w trakcie uruchamiania programu jest niedostpna. Typy generyczne maj szczeglnie due znaczenie dla kolekcji, poniewa pozwalaj definiowa typy elementw kolekcji. Od wersji 5.0 jzyka kolekcje w peni wykorzystuj typy generyczne.

Biblioteka Java Collections

36

Bartosz Walter

Zaawansowane projektowanie obiektowe

Przykad

Tradycyjne odwoania do kolekcji


List coll = new ArrayList(); for (Iterator iter = coll.iterator(); iter.hasNext(); ) Person osoba = (Person) iter.next(); System.out.println("osoba = " + person); }

Wykorzystanie typw generycznych


List<Person> coll = new ArrayList<Person>(); for (Iterator<Person> iter = coll.iterator(); iter.hasNext(); ) Person osoba = iter.next(); System.out.println("osoba = " + person); }
Biblioteka Java Collections (37)

Przykad pokazuje, czym rni si kod zapisany tradycyjnie od kodu wykorzystujcego typy generyczne. W drugim przypadku, dziki deklaracji typu Person jako typu elementw listy, nie ma potrzeby rzutowania wyniku metody next() iteratora. Kompilator wie, e obiekt zwracany przez t metod jest wanie oczekiwanego typu.

Biblioteka Java Collections

37

Bartosz Walter

Zaawansowane projektowanie obiektowe

Podsumowanie

Java Collections przykadem biblioteki ewoluujcej wraz z rozwojem jzyka Przykad dobrego wykorzystania interfejsw i implementacji Przemylany podzia odpowiedzialnoci interfejsw Rola wzorcw projektowych Wykorzystanie najnowszych zmian w jzyku`

Biblioteka Java Collections (38)

Podczas wykadu przeledzona zostaa ewolucja biblioteki Java Collections i zmiany w jej projekcie. Biblioteka ta ewoluowaa wraz ze zmianami w jzyku, pozostajc jednak zgodna wstecz z poprzednimi wersjami. Jest ona przykadem prawidowego i wywaonego podziau pomidzy abstrakcj (interfejsy) i implementacje, dziki czemu istniej dalsze moliwoci jej rozwoju. Projekt biblioteki Java Collections zawartej w JDK 1.2 zawiera kilka wzorcw projektowych pozwalajcych atwo osign podane waciwoci, co wskazuje na ich uyteczno. Najnowsza wersja pozwala na uycie typw generycznych, dziki ktrym moliwa jest weryfikacja typw elementw w momencie kompilacji. Biblioteka ta stanowi dobry przykad podania przez projektantw za potrzebami programistw z jednej strony i zmianami zachodzcymi w jzyku z drugiej.

Biblioteka Java Collections

38

You might also like