Professional Documents
Culture Documents
02 Collections and Generics Framework
02 Collections and Generics Framework
Generiki tipovi
Generiki tipovi
compile-time bug-ovi
run-time bug-ovi
generiki tipovi daju stabilnost omoguavaju
detekciju odreenih greaka za vrijeme
kompajliranja
Java Collections Framework koristi generike
tipove
Generiki tipovi
prije:
java.lang.ClassCastException
Generiki tipovi
generiki tip je referencni tip u ijoj se deklaraciji
iza naziva tipa nalazi lista parametara
ovi parametri se nazivaju i tipski parametri,
promjenljive tipa ili tipske promjenljive
ovi tipovi moraju biti poznati u vrijeme
kompajliranja kako bi se generiki tip mogao
koristiti
Generiki tipovi
sad:
public class Holder<T>{
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
deklaracija
generikog tipa
tipska
promjenljiva
T tipska promjenljiva:
moe se koristiti bilo gdje u klasi. Ista tehnika se moe primijeniti i na interfejse.
moe biti bilo koji klasni tip,
moe biti bilo koji tip interfejsa,
ne moe biti primitivni tip podataka.
ICT Akademija 2012
Generiki tipovi
Holder<Integer> integerHolder = new
Holder<Integer>();
Generiki tipovi
tipskoj promjenljivoj T moe se pristupiti iz nestatikog
konteksta
tipskoj promjenljivoj T ne moe se pristupiti iz statikog
konteksta
razlog ovog je to je tipska promjenljiva nestatika i ne
moe se koristiti u statikom kontekstu iz istog razloga kao
i bilo koja druga nestatika promjenljiva
generiki tipovi obuhvataju i generike interfejse
Parametrizovani tipovi
parametrizovani tip predstavlja koritenje generikog
tipa gdje su tipske promjenljive zamijenjene
parametrima stvarnog tipa
ovaj koncept slian je deklaraciji i koritenju metoda
da bi koristili metodu moramo, pri njenom pozivu,
proslijediti stvarne parametre
isto tako, da bi instancirali generiki tip, potrebno je
da mu proslijedimo parametre stvarnog tipa
deklarisanje referenci i kreiranje objekata
parametrizovanih tipova, kao i pozivi metoda nad
ovim objektima, slino je kao kod negenerikih klasa
ICT Akademija 2012
Parametrizovani tipovi
10
Parametrizovani tipovi
zamjenom tipskih promjenljivih parametrima razliitih
stvarnih tipova nastaju razliiti parametrizovani tipovi
izmeu njih ne postoji veza
tako
su
parametrizovani
tipovi
GenericHolder<Integer>
i
GenericHolder<String> razliiti i izmeu njih ne
postoji veza
kompajler e prijaviti svaki pokuaj nepravilne upotrebe
parametrizovanog tipa
na ovaj nain potencijalne greke mogu biti
detektovane ranije, za vrijeme kompajliranja
upotreba eksplicitnog kastovanja u izvornom kodu je
minimalizovana
ICT Akademija 2012
11
Parametrizovani tipovi
parametrizacija generikih interfejsa vri se na isti nain kao i parametrizacija
generikih klasa
12
13
14
15
je
da
generiki
tip
naslijedi
negeneriki
16
Brisanje tipova
kompajler prevodi generiku klasu tako da brie
informacije o tipskim promjenljivim
ovaj proces naziva se brisanje tipova (eng. type
erasure)
ako se program kompajlira bez unchecked
upozorenja, kompajler garantuje da e sigurnost
tipova za vrijeme izvravanja biti obezbjeena
17
Brisanje tipova
18
Kolekcije
Kolekcije
kolekcija nekad se naziva i kontejner
kolekcija je objekt koji grupie vie elemenata u jednu
jedinicu
koriste se za pohranjivanje, dobijanje, manipulaciju i
komunikaciju skupom podataka
obino reprezentuju jedinice podataka koji ine prirodnu grupu
npr.:
mail folder kolekcija poruka
telefonski imenik mapiranje imena u telefonske brojeve
ranije verzije Jave (prije 1.2) obuhvatale se Vector, Hashtable i
niz implementacije kolekcija
ranije verzije Jave (prije 1.2) nisu posjedovale Collections
framework
20
Collection Framework
Collections framework je unificirana arhitektura za
reprezentaciju i manipulaciju kolekcijama
posjeduje:
interfejse koji omoguavaju manipulaciju kolekcijama
nezavisno od njihove konkretne implementacije
implementacije konkretne implementacije interfejsa
algoritme metode koje vre korisne operacije, kao to
su pretraivanje i sortiranje, nad objektima klasa koje
implementiraju interfejse kolekcija algoritmi su
polimorfni, tj. ista metoda se moe koristiti nad mnogim
razliitim implementacijama odgovarajueg interfejsa
kolekcija
ICT Akademija 2012
21
22
23
24
Set
predstavlja skup jedinstvenih elemenata kolekcija koja ne moe sadravati duple elemente. Ovaj
interfejs predstavlja apstrakciju matematikog skupa.
SortedSet
nasljeuje Set interfejs dodajui mu mogunost sortiranja elemenata na odgovarajui nain
NavigableSet
nasljeuje SortedSet interfejs proirujui ga navigacionim metodama
List
ureena kolekcija (nekad se naziva i sekvenca)
moe sadravati duple elemente
elementima se moe pristupiti na bazi indeksa (pozicije)
slinost sa Vector klasom
Queue
kolekcija koja sadri elemente koje se trebaju procesirati
obino, ali ne obavezno, ureuju elemente u FIFO red izuzetak su prioritetni redovi
glavu reda ini element koji e biti uklonjen pozivom metode remove ili poll
novi elementi se dodaju na kraj reda, rep
drugi tipovi redova mogu koristiti drugaija pravila za smjetanje elemenata
Deque
nasljeuje Queue interfejs na takav nain da predstavlja red iji se elementi mogu procesirati s oba
kraja
25
26
Collection interfejs
Collection interfejs predstavlja grupu objekata - elemenata
Collection interfejs se koristi za manipulaciju kolekcijama u
sluaju kada je potrebna maksimalna generalizacija
sve implementacije kolekcija, po konvenciji, imaju
konstruktor koji kao argument ima Collection
ovaj konstruktor omoguava konverziju tipova kolekcije
naziva se i conversion konstruktor
primjer
Collection<String> c koji moe biti List, Set, ili druga
kolekcija (Collection tipa).
List<String> list = new ArrayList<String>(c);
27
Collection interfejs
boolean add(E e)
obezbjeuje da kolekcija sadri specificirani element ako e nije u kolekciji bie dodati; ako kolekcija
dozvoljava duple elemente e e biti dodat
vraa true ako je kolekcija izmijenjena
opciona operacija
boolean addAll(Collection<? extends E> c)
dodaje sve elemente specificirane kolekcije u tekuu kolekciju
opciona operacija
void clear()
uklanja sve elemente iz kolekcije
opciona operacija
boolean contains(Object o)
vraa true ako kolekcija sadri specificirani element
boolean containsAll(Collection<?> c)
vraa true ako kolekcija sadri sve elemente specificirane kolekcije
boolean equals(Object o)
poreenje specificiranog objekta sa tekuom kolekcijom
int hashCode()
vraa hash code tekue kolekcije
boolean isEmpty()
vraa true ako kolekcija ne sadri elemente
28
Collection interfejs
Iterator<E> iterator()
vraa iterator nad elementima tekue kolekcije
boolean remove(Object o)
uklanja jednu instancu specificiranog elementa iz kolekcije, ako je prisutan
opciona operacija
boolean removeAll(Collection<?> c)
uklanja sve elemente kolekcije koji su sadrani u specificiranoj kolekciji
opciona operacija
boolean retainAll(Collection<?> c)
ostavlja sve elemente tekue kolekcije koji su sadrani u specificiranoj kolekciji
opciona operacija
int size()
vraa broj elemenata kolekcije
Object[] toArray()
vraa niz koji sadri sve elemente kolekcije
<T> T[] toArray(T[] a)
vraa niz koji sadri sve elemente kolekcije, runtime tip vraenog niza je identian tipu specificiranog
niza
String[] y = x.toArray(new String[0]);
29
Collection interfejs
30
Collection interfejs
obilazak kolekcija
for-each konstrukcija
for (Object o : collection)
System.out.println(o);
iteratori
public interface Iterator<E> {
boolean hasNext();
E next();
void remove(); //opciono
}
------------------------------------------------public interface Collection<E>extends Iterable<E>
31
Collection interfejs
obilazak kolekcija
32
Set interfejs
Set je Collection koja ne moe sadravati duple
elemente
apstrakcija je matematikog skupa
Set interfejs sadri samo metode nasljeene iz
Collection i dodaje restrikciju zabranjuje duple
elemente
33
Set interfejs
Set uvodi snaniji ugovor po pitanju ponaanja equals i hashCode metoda omoguava da se Set
instance porede bez obzira na njihovu implementaciju dvije Set instance su jednake, ako sadre iste
elemente
34
35
SortedSet interfejs
nasljeuje Set interfejs dodajui mu mogunost sortiranja
elemenata na odgovarajui nain
svi elementi SortedSet-a moraju implementirati
Comparable interfejs (ili implementirati Comparator)
metode
36
NavigableSet interfejs
interfejs NavigableSet nasljeuje SortedSet
interfejs proirujui ga navigacionim metodama
navigacione metode slue za pronalazak
elemenata u kolekciji koja implementira interfejs
NavigableSet
preporuka je da se koristi umjesto SortedSet
interfejsa
37
NavigableSet interfejs
38
39
TreeSet primjer
40
HashSet vs TreeSet
HashSet:
konstantno vrijeme za osnovne operacije (add, remove, contains i size)
ne garantuje da e poredak elemenata biti ouvan
vrijeme iteracije kroz ovaj skup je proporcionalno sumi broja elemenata
(veliini HashSet instance) i kapaciteta pozadinske HashMap instance zato
je bitno da inicijalni kapacitet ne bude suvie veliki (ili da load factor ne
bude suvie mali), ako su performanse iteracije bitne)
TreeSet:
sloenost osnovnih operacija (add, remove i contains) nad ovom
strukturom O(logn)
garantuje da e elementi skupa biti sortirani (rastue u prirodnom poretku
ili u poretku koji definie komparator)
ne nudi parametre ijim podeavanjem se moe uticati na performanse
iteracije
nudi zgodne metode za rad sa skupovima, poput first(), last(), headSet(),
tailSet() i sl.
41
List interfejs
x[3] = "abc";
x.setElementAt("abc", 3);
x.set(3, "abc");
niz:
a[i] = a[j].method(a[k]);
Vector:
v.setElementAt(v.elementAt(j).method(v.elementAt(k)), i);
List:
v.set(i, v.get(j).method(v.get(k)));
ICT Akademija 2012
42
List interfejs
public interface List<E> extends Collection<E> {
// pozicioni pristup
E get(int index);
E set(int index, E element);
// opciona
boolean add(E element);
// opciona
void add(int index, E element);
// opciona
E remove(int index);
// opciona
boolean addAll(int index, Collection<? extends E> c);
// opciona
// pretraga
int indexOf(Object o);
int lastIndexOf(Object o);
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
// dio liste
List<E> subList(int from, int to);
}
ICT Akademija 2012
43
44
45
46
Queue interfejs
interfejs Queue nasljeuje Collection interfejs na takav nain da
predstavlja red
obino, ali ne obavezno, elementi se ureuju prema FIFO
algoritmu
mogue je da elementi budu ureeni i prema LIFO (Last In First
Out) algoritmu ili prema prioritetu
kod prioritetnih redova, elementi mogu biti u prirodnom
poretkom ili poretku koji je odreen komparatorom
47
Queue interfejs
svaka Queue metoda postoji u dva oblika, i to:
metoda baca izuzetak ako operacija ne uspije
metoda vraa specijalnu vrijednost ako
operacija ne uspije null ili false, zavisno od
operacije
baca izuzetak
insert
add(e)
offer(e)
remove
remove()
poll()
examine
element()
peek()
48
49
50
Interfejs Deque
interfejs Deque nasljeuje Queue interfejs na takav nain
da predstavlja linearnu kolekciju koja podrava ubacivanje
i uklanjanje elemenata sa oba kraja, tj. dozvoljava i
operacije nad repom, a ne samo nad glavom reda
veina implementacija ovog interfejsa nema ogranienje
broja elemenata koje moe sadravati, mada interfejs
obezbjeuje i tu mogunost
klase koje implementiraju ovaj interfejs mogu se koristiti
kao FIFO redovi, s tim da se elementi dodaju s repa, a
uzimaju s glave reda
pored toga, klase koje implementiraju ovaj interfejs mogu
se koristiti kao stek, s tim da se elementi dodaju i uzimaju
sa iste strane reda, prema LIFO algoritmu
ICT Akademija 2012
51
Interfejs Deque
52
Interfejs Deque
klasa ArrayDeque implementira interfejs Deque
ova implementacija nema ogranienje kapaciteta, tj. objekat ove klase
dinamiki raste koliko je to potrebno
ova klase nije sinhronizovana, tj. bez eksterne sinhronizacije, ona ne
podrava konkurentni pristup od strane vie niti
u ovu kolekciju nije dozvoljeno dodavati null elemente
elementi ove strukture se mogu obilaziti od glave prema repu ili
obrnuto, od repa prema glavi
pozicioni pristup elementima nije mogu, niti ih je mogue sortirati
veina metoda ArrayDeque klase izvrava se u amortizovanom
konstantnom vremenu. Tako, na primjer, sloenost dodavanja n
elemenata iznosi O(n).
izuzetak
su
metode
remove,
removeFirstOccurrence,
removeLastOccurrence, contains, iterator.remove() i bulk metode, koje
se izvravaju u linearnom vremenu, tj. njihova sloenost iznosi O(n)
53
Interfejs Deque
54
Interfejs Deque
klasa LinkedList implementira i interfejs Deque
55
Map interfejs
interfejs Map predstavlja korijen drugog stabla hijerarhije
kolekcija
ovaj interfejs definie metode za rad sa mapiranjima
(parovima) klju-vrijednost
ova struktura ne moe da sadri duple kljueve, a svaki klju se
moe mapirati u najvie jednu vrijednost
ne postoji veza vie-prema-jedan izmeu kljueva i vrijednosti
i kljuevi i vrijednosti moraju biti objekti.
interfejs Map specificira ugovor koji sve mape treba da
implementiraju neke od metoda ovog interfejsa su opcione
mapa koja ne implementira neku od metoda ovog interfejsa
obavezna je da obezbijedi da data metoda baci izuzetak
UnsupportedOperationException, u sluaju njenog poziva
slinost sa HashTable klasom
ICT Akademija 2012
56
Map interfejs
public interface Map<K,V> {
// osnovne operacije
V put(K key, V value);
V get(Object key);
V remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
// grupne operacije
void putAll(Map<? extends K, ? extends V> m);
void clear();
// konverzije
public Set<K> keySet();
public Collection<V> values();
public Set<Map.Entry<K,V>> entrySet();
// interfejs za entrySet elemente
public interface Entry {
K getKey();
V getValue();
V setValue(V value);
}
}
57
58
59
60
61
62
Interfejs SortedMap
interfejs SortedMap nasljeuje interfejs Map i
analogan je interfejsu SortedSet
objekti klasa koje implementiraju interfejs
SortedMap obezbjeuju poredak elemenata
(mapiranja) prema prirodnom poretku kljueva ili
prema komparatoru
svi kljuevi sortirane mape moraju implementirati
Comparable interfejs i moraju biti uzajamno
komparabilni, to znai da se pri poreenju bilo koja
dva kljua sortirane mape nee desiti izuzetak
ClassCastException
ICT Akademija 2012
63
Interfejs NavigableMap
interfejs NavigableMap nasljeuje interfejs
SortedMap i analogan je interfejsu NavigableSet
preporuka je da se koristi umjesto SortedMap
interfejsa
64
65
Klasa Collections
klasa Collections obezbjeuje razliite metoda za rad
sa kolekcijama, poput sortiranja, pretraivanja i
zamjene elemenata u kolekciji
sve metode ove klase su deklarisane kao static i
public
u sluaju kada se kao neki od argumenata neke od
metoda ove klase proslijedi null referenca, umjesto
reference na kolekciju, desie se izuzetak
NullPointerException
veliki broj metoda
u Java verziji 6, ukupno 52 metode ove klase
ICT Akademija 2012
66
Klasa Collections
metode za sortiranje modifikovani merge sort
algoritam
67
Klasa Collections
List l moe se sortirati pomou
Collections.sort(l);
ako se ova lista sastoji od String elemenata, bie
sortiran u alfabetskom poretku
ako se ova lista sastoji od Date elemenata, bie
sortiran u hronolokom poretku
i String i Date implementiraju Comparable interfejs,
kao i mnoge druge klase (Integer, Float, Double,
Character, Byte, Boolean,...)
implementacije Comparable interfejsa obezbjeuju
prirodni poredak objekata, to omoguava da objekti
ove klase budu automatski sortirani
ICT Akademija 2012
68
Klasa Collections
69
Klasa Collections
pretraivanje kolekcija
70
Klasa Collections
71
Klasa Collections
zamjena elemenata u kolekcijama
72
Klasa Collections
sinhronizacija kolekcija
Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized(c) {
Iterator i = c.iterator();//mora biti u sinhronizovanom bloku
while (i.hasNext())
func(i.next());
}
synchronizedSet
synchronizedSortedSet
synchronizedList
synchronizedMap
synchronizedSortedMap
73
Klasa Arrays
klasa Arrays obezbjeuje razliite metoda za rad sa
nizovima, poput sortiranja, pretraivanja i zamjene
elemenata u nizovima
sve metode ove klase su deklarisane kao static i
public
u sluaju kada se kao neki od argumenata neke od
metoda ove klase proslijedi null referenca, umjesto
reference na kolekciju, desie se izuzetak
NullPointerException
veliki broja metoda
u Java verziji 6, ukupno 105 metoda
ICT Akademija 2012
74
Klasa Arrays
sortiranje nizova quick sort algoritam
75
Klasa Arrays
pretraivanje nizova
76
Poredak objekata
Comparable interfejs
public interface Comparable<T> {
public int compareTo(T o);
}
compareTo metoda poredi primljeni objekat sa tekuim i vraa negativan
integer, 0 ili pozitivan integer, zavisno od toga da li je primljeni objekat manji,
jednak ili vei od tekueg objekta
ako se objekti ne mogu porediti metoda e baciti ClassCastException izuzetak
77
Poredak objekata
Comparator interfejs
public interface Comparator<T> {
int compare(T o1, T o2);
}
compare metoda poredi dva argumenta i vraa
negativan integer, 0 ili pozitivan integer, zavisno
od toga da li je prvi objekat manji, jednak ili vei
od drugog objekta
ako bilo koji od argumenata ima neodgovarajui
tip compare metoda baca ClassCastException
ICT Akademija 2012
78
Bitno
za Set interfejs HashSet je najee koriena
implementacija
za List interfejs ArrayList je najee koriena
implementacija
za Map interfejs HashMap je najee koriena
implementacija
za Queue interfejs LinkedList je najee
koriena implementacija
svaka od implementacija obezbjeuje sve
opcione metode iz odgovarajueg interfejsa
ICT Akademija 2012
79