Java Genericki Tipovi

Embed Size (px)

DESCRIPTION

Java Genericki Tipovi

Citation preview

  • Objektno orijentisano programiranjeJava, generiki tipovi

  • Izuzeci, nastavakVeina predefinisanih klasa izuzetaka u Javi ne dodaje dalje informacije o uslovima koji su kreirali izuzetakOvaj generalni nedostatak je iz razloga to te informacije u veini sluajeva mogu da se prikupe jedino predznanjem o izraunavanjima koja su vrena kada se desio izuzetak, a jedini ko zna o tome je onaj ko pie programAko nam je potrebno vie informacija o okolnostima pod kojima se desio izuzetak, moraemo sami da ih obezbedimo, tj. da definiemo sopstvene izuzetke

  • Definisanje naih izuzetakaPostoje 2 osnovna razloga za definisanje naih klasa izuzetaka:elimo da dodamo informacije kada se desi standardni izuzetak, i moemo to uiniti reizbacivanjem objekta nae klase izuzetakamoemo imati greke koje nastaju u naem kodu koje opravdavaju kreiranje specijalne klase izuzetaka Definisanje nae klase izuzetakanae klase izuzetaka moraju uvek imati Throwable za superklasu. Najbolje je izvoditi ih iz klase Exception, mada se mogu izvesti iz proizvoljne standardne klase izuzetaka. To e dopustiti kompajleru da prati gde u naem programu je izbaen izuzetak i da proverava da li je izuzetak uhvaen ili deklarisan kao izbaen u metodu. Ako kao superklasu koristimo RuntimeException ili neku od njenih potklasa, provera kompajlera bie ukinuta

  • Definisanje nae klase izuzetakaprimer:public class GrozanProblemException extends Exception {// Konstruktoripublic GrozanProblemException(){}

    public GrozanProblemException(String s){super(s); // poziv konstruktora bazne klase}}

  • Definisanje nae klase izuzetakaOvo je minimum koji treba da obezbedimo u definiciji nae klase izuzetaka ( podrazumevani konstruktor i konstruktor koji prihvata String-argument )Poruka smetena u superklasi Exception ( zapravo Throwable) e automatski biti inicijalizovana imenom nae klase, bez obzira na to koji konstruktor nae klase se koristi. String prosleen drugom konstruktoru bie dopisan na ime klase da bi se formirala poruka koja se uva u objektu izuzetkuNaravno, mogu se dodati i drugi konstruktori. Generalno, eleemo to, posebno ako reizbacujemo na izuzetak nakon izbacivanja standardnog izuzetka.Dodatno, tipino emo eleti da dodamo instancne promenljive koje e uvati dodatne informacije o problemu, plus metode koji e omoguiti kodu u catch bloku da pristupa tim podacima.Poto je naa klasa obavezno izvedena iz klase Throwable, informacije steka izvravanja e biti automatski dostupne naim izuzecima

  • Izbacivanje naeg izuzetkathrow-naredbom, kao to je ranije reeno, npr. GrozanProblemException e = new GrozanProblemException(); throw e;Metod e prekinuti izvravanje u ovoj taki osim ako je gornji iseak koda u try ili catch bloku, sa pridruenom finally klauzom iji e se sadraj izvriti pre kraja metoda. Izuzetak e biti izbaen u pozivajui program u taki gde je pozvan metod. Poruka u objektu izuzetka e se sastojati samo od kvalifikovanog imena klase izuzetaka.Ako elimo da dodamo specifinu poruku izuzetku: GrozanProblemException e = new GrozanProblemException("Uh, nevolja!");Ovde smo koristili drugi konstruktor

  • Izbacivanje naeg izuzetkagetMessage() metod nasleen od Throwable e vratiti String objekat koji sadri sledei string:"GrozanProblemException: Uh, nevolja!"moe i ovako, u jednoj naredbi:throw new GrozanProblemException("Strasne poteskoce!");Strategija rukovanjem izuzecimaPotrebno je promisliti ta elimo da postignemo rukovanjem izuzecima u naem programu. Ne postoje vrsta pravila. U nekim situacijama moemo popraviti problem i omoguiti da program nastavi da se izvrava kao da se nita nije desilo. U drugim situacijama, ispis steka izvravanja i brzi zavretak programa predstavljaju najbolji pristup brzi zavretak programa se postie pozivom metoda exit() klase System.

  • Generiki klasni tipovita su generiki tipovi?Generiki tip, koji se takoe naziva i parametrizovani tip, je definicija klase ili interfejsa koja ima jedan ili vie parametara.Stvarni klasni ili interfejsni tip se dobija od generikog prosleivanjem argumenta tipa za svaki od parametara koji se pojavljuju u generikom tipu

  • Definisanje generikog klasnog tipaNa primeru povezane listeDefinicija generikog klasnog tipa izgleda vrlo slino definiciji obine klase, ali uz zadavanje parametara nakon imena klase. Npr.public class PovezanaLista{// Definicija genericke klase }Parametar koji se pojavljuje izmeu naziva se tipski parametar. Ime, T, identifikuje tipski parametar i to ime parametra se koristi u definicijama metoda i atributa generikog tipa na mestima gde postoji zavisnost od vrednosti argumenta za taj parametarPojavljivanja imena parametra u definiciji generikog tipa nazivaju se tipske promenljive.

  • Definisanje generikog klasnog tipaGeneralno je najbolje da imena parametara budu to je mogue kraa a idealno jednoslovna. U tekstu e na ime generikog tipa biti nadovezivano i radi lakeg razlikovanja generikog tipa od obine klase ili tipa interfejsa.Mogue je definisati generiki klasni tip, ali takoe i generiki interfejsni tip. Prilian broj generikih interfejsnih tipova mogue je nai u standardnim paketima. Kasnije emo raditi sa Iterable i Comparable generikim interfejsnim tipovima iz paketa java.langDa bismo kreirali klasu od generikog tipa PovezanaLista samo obezbedimo odgovarajui argument za parametar izmeu zagrada. Sva pojavljivanja tipske promenljive T u definiciji bie zamenjena datim tipom argumenta. To e rezultirati klasnim tipom koji moemo koristiti da kreiramo objekat koji implementira povezanu listu za smetanje objekata zadatog tipaPovezanaLista , PovezanaLista

  • Argumenti generikog klasnog tipaTako, generiki tip u sutini definie familiju tipova koja se dobija prosleivanjem razliitih argumenata za parametre generikog tipa.Kao argument za tipski parametar u generikom tipu moe se staviti samo klasni ili interfejsni tipDrugim reima, kao argument se ne moe koristiti primitivni tip poput int i double, iako se, naravno, moe koristiti tip Integer ili tip Double.Kada kreiramo odreeni tip od definicije generikog tipa prosleivanjem vrednosti argumenta za T, argument e zameniti svaku pojavu T-a u specifikaciji generikog tipa. To se odnosi i na atribute i na definicije metoda u generikom tipu.Definicija generikog tipa smeta se u izvorni fajl sa ekstenzijom .java, upravo kao i obina klasa.

  • Implementiranje generikog tipa

    PovezanaLista.javaKlasa ClanListe je unutranja ( ugnjedena nestatika )Definicija generikog tipa moe sadrati obine metode koji ne ukljuuju nikakve parametre u svojim definicijama kao i metode sa parametrimaSada imamo generiki tip PovezanaLista koji moemo koristiti da kreiramo novu klasu PovezanaLista za smetanje objekata proizvoljnog tipa. Pogledajmo kako da ga koristimo

  • Instanciranje generikog tipaDa bismo definisali novi tip, koristimo ime generikog tipa praeno imenom klasnog ili interfejsnog tipa unutar zagrada. Npr. PovezanaLista stringovi; // prom. tipa PovezanaListaOvo samo definie promenljivu imena stringoviTip ove promenljive je PovezanaListaKao rezultat ove naredbe, kompajler e koristiti tipski argument String koji smo obezbedili da zameni svaku instancu tipske promenljive T u definiciji generikog tipa kako bi doao do definicije za klasni tip PovezanaListaNaravno, kada definiemo promenljivu, moemo definisati objekat: PovezanaLista stringovi = new PovezanaLista();Ovim se poziva podrazumevani konstruktor klasnog tipa PovezanaLista da definie objekat koji implementira povezanu listu String objekata

  • Instanciranje generikog tipaArgument koji prosleujemo generikom tipu takoe moe biti i tipa koji definiemo korienjem generikog tipa. Npr.PovezanaLista tekstovi = new PovezanaLista();Ovde smo definisali povezanu listu povezanih listaDa bismo primenili novi generiki tip PovezanaLista piemo PolyLine koristei tip generisan iz generikog tipa PovezanaLista TestGenericPovezanaLista

  • Komentarisanje programaKlasa Polyline kreira tip PovezanaLista od generikog tipa PovezanaLista koji e implementirati povezanu listu Point objekata: private PovezanaLista polyline; Metodi u parametrizovanom tipu se koriste na isti nain kao oni u originalnoj definiciji klase PovezanaLista koja je implementirana bez upotrebe generikih klasnih tipova.

  • Upotreba Wrapper klasa primitivnih tipova kao argumenataU sluaju da elimo da smetamo vrednosti primitivnog tipa u kolekciju poput povezane liste, koristimo generiki tip sa nekom od Wrapper klasa kao tipskim argumentom. To su klase Integer, Short, Double itd. definisane u paketu java.langNpr. za upotrebu generikog tipa PovezanaLista za smetanje vrednosti tipa double:PovezanaLista temperature = new PovezanaLista();Ovde smo kreirali povezanu listu za smetanje objekata tipa Double, a autoboxing omoguuje da se objekat PovezanaLista koristi direktno sa vrednostima tipa double. Npr. da bismo efektivno dodali vrednost tipa double povezanoj listi koju smo upravo kreirali: temperature.dodajClan(10.5);Poto je tipski parametar za ovaj metod za objekat tipa PovezanaLista tipa Double, kompajler e automatski ubaciti boxing konverziju za konvertovanje double vrednosti 10.5 u objekat tipa Double koji je enkapsulira.

  • Viestruki parametri tipaGeneriki tip PovezanaLista ima jedan parametar tipa , T.U optem sluaju moe se definisati generiki tip sa proizvoljnim brojem parametara.Npr. generiki tip koji definie skup klasa koje enkapsuliraju par objekata proizvoljnih tipova. To se tipino dogaa kada se 1 objekat koristi kao klju za pristup drugom u kolekciji. Npr.public class Par{// Konstruktorpublic Par(KljucTip kljuc, VrednostTip vrednost){this.kljuc=kljuc;this.vrednost=vrednost;}// get*() i set*() metodiprivate KljucTip kljuc;private VrednostTip vrednost;}

  • Viestruki parametri tipaPraktina definicija e biti komplikovanija od ove, npr. bie potrebno sredstvo za poreenje kljueva, ali ova definicija je dovoljna za demonstriranje korienja 2 parametra u definiciji generikog tipa.Primer korienja ovog generikog tipa:Par unos = new Par( "Petar Petrovic","212 222 3333");kreira se objekat tipa Par i referenca na njega se smeta u promenljivu unos.

  • Opseg tipskog parametraOpseg tipskog parametra je cela definicija generike klase, ali iskljuujui statike lanove i inicijalizatore u klasi.To povlai da se unutar definicije generikog tipa ne moe nai statiki atribut tipa tipske promenljive.Slino, statiki metodi ne mogu imati parametre ili povratne tipove koji su tipa tipske promenljiveTipske promenljive se ne mogu koristiti u telima definicija statikih metodaTo ne znai da statiki metodi ne mogu biti parametrizovani ovde je re samo o tipskim promenljivim odgovarajuim za parametre definicije generikog tipa, a postoje i tzv. generiki metodi koji imaju svoju nezavisnu parametrizovanu definiciju koja ukljuuje sopstveni skup parametara, i takvi parametrizovani metodi mogu biti statiki ili nestatiki

  • Generiki (parametrizovani) metodiMogue je definisati metod sa sopstvenim nezavisnim skupom od 1 ili vie tipskih parametara, ime se dobija parametrizovani metod ili generiki metodMoemo imati parametrizovane metode i u obinoj klasiMetodi unutar definicije generikog tipa takoe mogu imati nezavisne parametre. Npr.public static void listAll(PovezanaLista list){for(T obj: list)System.out.println(obj);}

  • Generiki (parametrizovani) metodi nakon kljunih rei public i static je lista tipskih parametara za generiki metod. Ovde imamo samo jedan tipski parametar, T, ali moe ih biti i vie.Lista tipskih parametara za generiki metod se uvek ograuje zagradama i treba da prati eventualne modifajere poput public i static i treba da prethodi povratnom tipu.Generiki konstruktori: konstruktor je specijalizovana vrsta metoda i moe se definisati i konstruktor sa sopstvenim nezavisnim parametrima. Parametrizovani konstruktori se mogu definisati i za generike i za obine klasne tipove

  • Parametrizovani tipovi i nasleivanjeKlasu je mogue definisati kao potklasu klasnog tipa koji je instanca generikog tipaMetodi i atributi e biti nasleeni od bazne klase na uobiajeni nainMora se voditi rauna da se u izvedenoj klasi ne definiu metodi koji imaju isti potpis kao neki nasleeni metod.

    Nizovi i parametrizovani tipovi

    Nizovi elemenata tipa dobijenog od generikog tipa nisu doputeni. Sledea naredba e rezultovati porukom kompajlera o greci: PovezanaLista[] liste = new PovezanaLista[10];

    private T[] data; // ovo je okdata = new T[10]; // Nije dopusteno!!!

  • Generiki tipovi i generiki interfejsiGeneriki tip moe implementirati 1 ili vie interfejsnih tipova, ukljuujui generike interfejsne tipove.Sintaksa koja se koristi za ovo je ista kao za obine klase i interfejsne tipove, jedina razlika je to e ime svakog generikog tipa biti praeno njegovom listom tipskih parametara izmeu zagrada. Npr.public class MyClass implements MyInterface{// Detalji definicije generickog tipa }

  • Kolekcije i collection-based for petljaDa bi objekat kontejnerskog klasnog tipa bio upotrebljiv sa collection-based for petljom, klasa mora da ispuni jedan zahtev mora implementirati generiki interfejs Iterable koji je definisan u paketu java.lang.Interfejs Iterable je generiki tip koji deklarie 1 jedini metod iterator(), koji vraa referencu tipa Iterator koji je jo jedan generiki interfejsni tip

  • Java Collections FrameworkJava Collections Framework se sastoji od generikih tipova koji predstavljaju skupove kolekcijskih klasa.Ovi generiki tipovi definisani su u paketu java.util i obezbeuju nam mnotvo naina za struktuiranje i rukovanje kolekcijama objekata u naim programima.Posebno, tipovi kolekcija nam omoguuju da se nosimo sa situacijama kada ne znamo unapred koliko emo objekata imati ili kada nam je potrebno vie fleksibilnosti u nainu na koji pristupamo objektu kolekcije nego to imamo indeksiranjem niza

  • Java Collections FrameworkKolekcijska klasa je prosto klasa koja organizuje skup objekata datog tipa na odreeni nain, poput povezane liste ili stekaKorienje generikog tipa za nae kolekcije objekata znai da imamo statiku proveru od strane kompajlera tipova koje elimo da obraujemo. Time se obezbeuje spreavanje nemarnih pokuaja smetanja objekata pogrenog tipa u kolekciju ( kolekcija je type-safe)Collections Framework ukljuuje profesionalnu implementaciju generikog tipa koji implementira povezanu listu koja je daleko superiornija od povezane liste koju smo sami implementirali. Meutim, na trud nije bio uzaludan, poto sada imamo dobru ideju o tome kako funkcioniu povezane liste i kako se definiu generiki tipovi.

  • Java Collections FrameworkOtkriemo da je Collections Framework vaan faktor u veini naih programa. Kada elimo niz koji se automatski proiruje kako bi se prilagodio proizvoljnom broju objekata koji ubacujemo u njega, moemo koristiti odgovarajui generiki tip implementiran u Collections Framework-u.U Collections Framework-u ima toliko toga, ali potrudiemo se da pogledamo kako se primenjuju neki reprezentativni primerci kolekcija koji e nam verovatno najee trebati:Iterator interfejsni tip, deklarie metode za iteriranje kroz elemente kolekcije, jedan po jedanVector tip, nizolika struktura za smetanje proizvoljnog tipa objekata. Broj objekata koje moemo smestiti automatski se poveava po potrebiStack tip, podrava smetanje proizv. tipa objekata na stekLinkedList tip, podrava smetanje proizv. tipa objekata u dvostruko povezanu listuHashMap tip, podrava smetanje objekata tipa V u he tabelu koju nazivamo katalogom/mapom. Objekat se smeta korienjem pridruenog kljua koji je objekat tipa K. Da bismo pristupili objektu, moramo proslediti njegov klju

  • Kolekcije objekata, opta razmatranjaObjekat tipa PovezanaLista predstavlja primer kolekcije objekata tipa T, gde T moe biti proizvoljni klasni ili interfejsni tipKolekcija je izraz koji se koristi da opie objekat koji predstavlja skup objekata grupisanih zajedno i organizovanih na odreeni nain u memoriji.Klasa koja definie kolekciju objekata esto se naziva kontejnerskom klasom.Postoje 3 osnovna tipa kolekcija za organizovanje objekata na razne naine:skupovi (sets), nizovi (sequences) i mape/katalozi (maps)Kada priamo o kolekcijama objekata, zapravo mislimo na kolekcije referenci na objekte. U Javi, kolekcije sadre samo reference na objekte, sami objekti su eksterni za kolekciju

  • Skupovinajjednostavnija vrsta kolekcijeobjekti nisu ureeni ni na koji nain i jednostavno se dodaju skupu bez ikakve kontrole gde e se smestiti. To je kao kada stavljamo stvari u dep samo ih stavimo unutramoemo dodavati objekte skupu i iterirati kroz sve objekte skupatakoe, moemo proveriti da li je objekat element skupa ili neu skupu nema ponavljanja elemenata svaki objekat u skupu mora biti jedinstvenmoemo i ukloniti dati element iz skupa, ali samo ako imamo referencu na taj objekat u skupupostoje i varijacije skupova npr. skup moe biti ureen. Takvi skupovi zahtevaju da objekti koji se smetaju u skup budu tipa klase koja definie pogodne metode za poreenje objekata

  • NizoviPovezana lista je primer optijeg tipa kolekcije, niza.Osnovna karakteristika niza je da se objekti smetaju linearno, ne nuno u odreenom redosledu, ali su organizovani u neki proizvoljni fiksirani redosled gde se zna poetak i krajobian niz je takoe primer niza, ali sa mnogo veim ogranienjima u odnosu na ekvivalentnu kolekciju poto sadri fiksiran broj elemenataKolekcije generalno imaju mogunost da se ire kako bi se prilagodile potrebnom broju elemenata Poto je niz linearan, novi objekat se moe dodati samo na poetak ili na kraj ili nakon datog objekta u nizu.Generalno, objektu niza se moe pristupiti na nekoliko naina: moemo izabrati prvi ili poslednji, objekat na datoj poziciji indeksiranje niza, zatim, moemo traiti objekat jednak datom objektu proverom svih objekata niza bilo unapred, ili unazadZa uklanjanje objekta iz niza imamo iste opcije kao za pristup objektu: moemo ukloniti prvi ili poslednji, objekat sa date pozicije ili objekat jednak datom objektuNizovi mogu sadrati nekoliko kopija istog objekta na razliitim mestima u nizu

  • StekStek ( stack ) last-in first-out (LIFO) struktura je takoe nizRed (queue) first-in first-out (FIFO) strukturaJednostavno se vidi da se povezana lista ponaa kao stek, poto korienje metoda za dodavanje objekata na kraj liste i uklanjanje objekata sa kraja liste ini da se lista ponaa kao stekSlino, samo dodavanje objekata korienjem metoda za dodavanje objekata na kraj povezane liste i samo uzimanje objekata sa poetka liste ini da se ona ponaa kao FIFO redU Java Collections Framework tipovi koji definiu nizove podeljeni su u 2 grupe: liste i redoveVektori, povezane liste i stekovi su liste, a queue(FIFO) je red

  • Mape/KataloziMape se prilino razlikuju od kolekcija skupova i nizova, poto svaki njihov unos ukljuuje par objekataMape se ponekad zbog naina na koji funkcioniu nazivaju i renicimaSvaki objekat smeten u mapi ima pridruen objekat klju i objekat i njegov klju se smetaju zajedno, u paru.Klju odreuje gde e objekat biti smeten u mapi, i kada elimo da mu pristupimo, moramo proslediti odgovarajui klju ( klju je ekvivalent rei koju traimo u reniku )Klju moe biti proizvoljna vrsta objekta koju elimo da koristimo za referisanje objekata iz mapePoto klju mora jedinstveno da identifikuje objekat, svi kljuevi u mapi moraju biti razliitiKlju je mehanizam za pristupanje objektimaHEIRANJE:Gde e par klju/objekat biti smeten u mapi odreeno je procesom koji se zove heiranjeHeiranjem se od kljua dobija celobrojna vrednost koja se zove hekod (hashcode)Metod hashCode() definisan u klasi Object proizvodi hekod tipa int za objekat.

  • IteratoriIterator je objekat koji moemo da koristimo jedanput za pristup svim objektima kolekcije, jednom po jednom.Korienje iteratora je standardni mehanizam za pristup svim elementima kolekcijeSvaki objekat kolekcije koji predstavlja skup ili niz moe kreirati objekat tipa Iterator koji se ponaa kao iterator. Tipovi koji predstavljaju mape nemaju metode za kreiranje iteratoraIterator objekat enkapsulira reference na sve objekte kolekcije u nekom redosledu i njima se moe pristupiti, jednoj po jednoj, korienjem metoda Iterator interfejsa

  • IteratoriInterfejs Iterator ( paket java.util ) deklarie sledea 3 metoda:T next() vraa objekat tipa T, poev od prvog i postavlja Iterator objekat tako da vrati sledei objekat prilikom sledeeg poziva ovog metoda. Ako nema objekta koji treba vratiti, metod izbacuje izuzetak NoSuchElementException

    boolean hasNext() vraa true ako postoji objekat kome e se pristupiti next() metodom, false inae

    void remove() uklanja poslednji objekat vraen metodom next() iz kolekcije. Ako next() nije pozvan ili pozovemo remove() 2 puta nakon poziva next(), izbacuje se izuzetak IllegalStateException Ne podravaju svi iteratori ovaj metod i ukoliko ga pozovemo u tom sluaju, bie izbaen izuzetak UnsupportedOperationException

  • IteratoriPoziv next() metoda za objekat koji implementira Iterator vraa uzastopne objekte iz kolekcije, poev od prvog, pa se jednostavno moe pomou petlje proi kroz celu kolekciju:MyClass item;while( iter.hasNext() ) {item = iter.next();// radimo nesto sa item }ovde se pretpostavlja da je iter tipa Iterator i uva referencu na objekat dobijen iz proizvoljne kolekcijske klaseVeina objekata kolekcija ima metod iterator() koji vraa iterator za tekui sadraj kolekcijeMetod next() vraa objekat originalnog tipa, pa nema potrebe za kastovanjemSvaki put kada iznova treba proi kroz objekte kolekcije, potreban je novi iterator, poto je iterator objekat za "jednokratnu upotrebu" Iterator je "jednosmerna ulica" moemo proi kroz objekte kolekcije, 1 po 1, jednom i to je to. To je uglavnom zadovoljavajue, ali ne potpuno, pa imamo i druge mogunosti za pristup celokupnom sadraju kolekcijeMoemo pristupati objektima proizvoljne kolekcije koja implementira interfejs Iterable koristei collection-based for petlju.Ako to nije dovoljno, postoji fleksibilnija vrsta iteratora list iterator.

  • List iteratoriListIterator interfejs, definisan u paketu java.util, deklarie metode za kretanje kroz kolekciju unapred i unazad, pa se jednom objektu moe pristupiti i vie od jedanputListIterator interfejs nasleuje Iterator interfejsni tip, pa se mogu primenjivati i metodi superinterfejsa koje smo upravo videli.Metodi definisani u ListIterator interfejsu za kretanje kroz listu objekata su:T next()boolean hasNext() kao kod Iteratorint nextIndex() vraa indeks objekta koji e biti vraen sledeim pozivom next() kao tip int, ili vraa broj elemenata u listi ako je ListIterator objekat na kraju listeT previous() vraa prethodni objekat, koristi se za kretanje unazad kroz listuboolean hasPrevious() vraa true ako e sledei poziv previous() vratiti objekatint previousIndex() vraa indeks objekta koji e biti vraen sledeim pozivom previous() ili -1 ako je ListIterator objekat na poetku listepozivi next() i previous() mogu se preplitati. Poziv previous() neposredno nakon poziva next() i obrnuto vratie isti element.

  • List iteratoriListIterator metodi za dodavanje, uklanjanje i zamenu objekata kolekcije su:void remove()uklanja poslednji objekat kome je pristupljeno pomou next() ili previous()(UnsupportedOperationException, IllegalStateException)void add(T obj)dodaje argument neposredno ispred objekta koji bi bio vraen narednim pozivom next() ili iza objekta koji bi bio vraen narednim pozivom previous(). Poziv next() nakon add() operacije vratie dodati objekat. Naredni poziv previous() nije izmenjen ovom operacijom(UnsupportedOperationException,ClassCastException, IllegalOperationException) void set(T obj) menja poslednji objekat kome je pristupljeno pozivomnext() ili previous()(IllegalStateException, UnsupportedOperationException,ClassCastException, IllegalArgumentException)

  • Korienje vektoraGeneriki tip Vector funkcionie kao niz, ali uz mogunost da automatski raste kada nam je potreban dodatni kapacitetKreiranje VektoraPostoje 4 konstruktora:Vector a = new Vector();podrazumevani, prazan vektor sa kapacitetom za 10objekata, kapacitet se duplira kada dodamo objekat, a vektor je punVector a = new Vector(100);eksplicitno zadajemo kapacitet, opet se kapacitetduplira, nekad neefikasnoVector a = new Vector(100,10);kapacitet e se poveavati za po 10 elemenataposlednji konstruktor kreira objekat koji sadri reference na objekte iz druge kolekcije ( prima argument tipa Collection)

  • Vektori, primerPrimer: vrlo jednostavan, smetanje nekoliko stringova u vektorimport java.util.Vector;public class TestJednostavanVektor{public static void main(String[] args){Vector imena = new Vector();String[] imena1 = {"Pera", "Mika", "Laza", "Steva"};// Dodavanje imena u vektorfor(String ime: imena1)imena.add(ime);// Prikaz sadrzaja vektorafor(String ime: imena)System.out.println(ime);}}

  • Vektori, primerSve kolekcijske klase koje su nizovi implementiraju Iterable interfejs, pa uvek moemo koristiti collection-based for petlju za pristup sadraju kolekcije.Takoe, moe se koristiti i iteratorSledei kod proizvee isti rezultat kao poslednja for petlja:java.util.Iterator iter = imena.iterator();while( iter.hasNext() )System.out.println( iter.next() );Za pristup elementima vektora postoji i trei mehanizam. Metod get() Vector objekta vraa referencu na objekat iji je indeks dat kao argument metoda. Argument get() metoda je indeks ( koji kree od nule ). Da bismo iterirali kroz sve elemente vektora moramo znati koliko elemenata imamo u vektoru, a to moemo dobiti metodom size().for(int i=0; i
  • Kapacitet i veliina vektoraKapacitet vektora je maksimalan broj objekata koje on moe sadrati u datom trenutkuint imenaMax = imena.capacity(); // vraca trenutni kapacitetimena.ensureCapacity(150); // postavlja min kapacitet na 150ako je tekui kapacitet manji od 150, porae na 150, a ako je 150 ili vei,ova naredba ga nee promenitiArgument je tipa int, ne postoji povratna vrednostVeliina vektora je broj elemenata smetenih u taj vektorJasno, veliina vektora ne moe biti vea od njegovog kapacitetaimena.setSize(50);metodom setSize() moemo poveati i smanjiti veliinuVeliina se postavlja na argument. Ako je veliina bila manja od 50, ostatak se puni null referencama, a ako je bila vea od 50, ostatak se odbacuje.Sami objekti jo uvek mogu biti dostupni ako postoje druge reference na njih.imena.trimToSize(); // kapacitet se postavlja na velicinu

  • Smetanje objekata u vektorimena.add(ime); novi objekat se smeta u vektor i to na kraj svih objekata koji su ve u vektoru, veliina vektora se uveava za 1. Svi "stari" objekti ostaju na istim pozicijama gde su bili i pre ove operacijeimena.add(2,ime); smetanje objekta u vektor na poziciju zadatu prvim argumentom. Ta pozicija mora biti manja ili jednaka veliini vektora ( to znai da se na tom mestu ve nalazi neka referenca ili je to pozicija na kraju vektora). Indeksiranje kree od nule. Novi objekat ime u ovom konkretnom sluaju se smeta ispred objekta koji je ranije imao indeks 2, pa se taj i svi ostali objekti sa veim indeksima pomeraju za 1 udesno i odgovarae im indeksi za po 1 vei nego pre ove operacije ( ArrayIndexOutOfBoundsException )imena.set(2,novoIme); promena elementa u vektoru, objekat zadat drugim argumentom smeta se na poziciju u vektoru zadatu prvim argumentom. Metod vraa referencu na objekat prethodno smeten na toj poziciji ( -||- izuzetak )

  • Smetanje objekata u vektorimena.addAll(imenaLista); dodavanje svih objekata druge kolekcije u vektor i to na njegov kraj (argument je tipa Collection)imena.addAll(i,imenaLista); -||-, ali ne na kraj, nego poev od pozicije i (ArrayIndexOutOfBoundsException)

    Pristup objektima vektora

    String ime = imena.get(4); // vraca element na zadatoj pozicijipovratni tip je odreen tipskim argumentom korienim za kreiranje Vector objekta. Indeks mora biti nenegativan i manji od veliine vektora, inae ArrayIndexOutOfBoundsExceptionString ime = imena.firstElement(); // vraca prvi elementpostoji i metod lastElement() koji vraa poslednji element

  • Pristup elementima vektora preko List iteratoraMoemo dobiti ListIterator referencu iz vektora pozivom metoda listIterator() :ListIterator listIter = imena.listIterator();nakon ovoga moemo se kretati unapred i unazad koristei ListIterator metode koje smo ranije videliMogue je dobiti i ListIterator objekat samo za deo vektora koristei verziju listIterator() metoda sa argumentom koji predstavlja indeks prvog elementa vektora u iteratoru:ListIterator listIter = imena.listIterator(2); (IndexOutOfBoundsException)List lista = imena.subList(2,5); // ekstrahuje elemente 2 do 4 kao podlistu!element sa indeksom odreenim drugim argumentom se ne ukljuuje u listu! (IndexOutOfBoundsException)KOMBINACIJE:ListIterator listIter = imena.subList(5,15).listIterator(2);prvo se pomou subList() dobije List objekat, pa on vrati list iterator tipa ListIterator metodom listIterator()

  • Konverzija vektora u nizmetod toArray()String[] podaci = imena.toArray(new String[imena.size()]);argument metoda mora biti niz istog tipa ili supertipa za tip elemenata vektora( ArrayStoreException, ako je argument null NullPointerException )

    Konverzija niza u vektor

    klasa java.util.Arrays definie statiki generiki metod asList() koji konvertuje niz datog tipa T u kolekciju List. Npr.String[] ljudi = { "Pera", "Mika", "Laza", "Steva" };List imenaLista = java.util.Arrays.asList(ljudi);Vector imena = new Vector(java.util.Arrays.asList(ljudi));

  • Uklanjanje objekata iz vektoraremove(3); uklanja element sa zadate pozicije, elementi iza se pomeraju za po 1 mesto ulevo ( IndexOutOfBoundsException) Vraa se referenca na uklonjeni objekat.String ime = imena.remove(3);

    boolean izbrisan = imena.remove(ime);pretrauje vektor imena od poetka i trai prvu referencu na objekat ime i uklanja je. Ako je objekat pronaen i uklonjen iz vektora, vraa true, a inae falseremoveAll() prihvata argument tipa Collection i uklanja elemente te kolekcije ako su prisutni u vektoru. Metod vraa true ako je Vector objekat promenjen ovom operacijom ( bar 1 el. uklonjen ). Moe se koristiti u kombinaciji sa metodom subList() da ukloni odreeni skup elemenata:imena.removeAll(imena.subList(5,15));uklonie elemente 5 do 14, ukljuujui, iz Vector objekta imena, plus eventualne duplikate tih elemenata ako postoje u vektoru

  • Uklanjanje objekata iz vektoraretainAll() metod oekuje kao argument referencu na tip Collection koja sadri objekte koje treba zadrati. Svi elementi koji nisu u toj kolekciji bie obrisaniimena.retainAll(imena.subList(5,15));vraa true ako je vektor promenjenimena.removeAllElements(); uklanja sve elemente vektora, veliina se postavlja na 0moe i imena.clear();boolean prazan = imena.isEmpty(); vraa true ako je veliina 0, false inaeVector objekat moe sadrati null reference, ali to ne znai da e size() biti 0 ili metod isEmpty() vratiti true. Da bismo ispraznili Vector objekat, moramo zaista ukloniti sve elemente, a ne samo postaviti ih na null.

  • Pretraivanje vektoraMoemo dobiti poziciju objekta smetenog u vektoru prosleujui ga kao argument metodu indexOf():int pozicija = imena.indexOf(ime);e pretraivati vektor imena od poetka traei objekat ime, koristei metod equals za argument, pa klasa objekta ime mora imati odgovarajuu implementaciju metoda equals() da bi ovo radilo. Promenljiva pozicija e dobiti ili indeks prve reference ili -1 ako objekat nije pronaenindexOf(ime,5) - slino, ali trai poev od indeksa 5npr. ( rauna se broj pojavljivanja datog imena u datom vektoru )String ime = "Pera"; // ime koje se traziint count = 0; // broj pojavljivanjaint position = -1; // pocetni indexwhile ( ++position < imena.size() ){if((position=imena.indexOf(ime,position))
  • Primena vektoraGuzvaProgram za modeliranje kolekcije ljudi, imena osoba e se unositi sa tastatureAlternative za ispis:for(int i=0; i
  • Sortiranje kolekcijepaket java.utilklasa Collections ( ne interfejs Colleciton ! )ima mnotvo statikih metoda koji se mogu primeniti na kolekcije1 od njih je i metod sort()metod sort() sortira iskljuivo liste, tj. kolekcije koje implementiraju interfejs List ( a to su Vector, Stack i LinkedList )Oigledno, mora da postoji nain na koji e sort() metod utvrditi redosled objekata liste koju sortira, u naem sluaju Osoba objekataNajpogodniji nain je da klasa Osoba implementira interfejs ComparableInterfejs Comparable deklarie samo 1 metod, compareTo(). On vraa -1, 0 ili +1 u zavisnosti od toga da li je tekui objekat manji, jednak ili vei od argumenta prosleenog metodu.Ako je Comparable interfejs implementiran za tip objekata smetenih u kolekciji, moemo samo proslediti objekat kolekciju kao argument sort() metodu. Kolekcija se sortira "u mestu", pa ovaj metod nema povratnu vrednost.

  • Sortiranje kolekcijeComparable interfejs se moe jednostavno implementirati u klasi Osoba:public class Osoba implements Comparable{// .// poredjenje Osoba objekatapublic int compareTo(Osoba osoba){int rezultat = prezime.compareTo(osoba.prezime);return rezultat==0 ? ime.compareTo(((Osoba)osoba).ime):rezultat;}// }koristimo compareTo() metod za String objekte da uporedimo prezimena, pa ako su ona jednaka, rezultat odreujemo na osnovu imena

  • Sortiranje kolekcijaMoemo samo proslediti Vector objekat metodu sort() i koristie se metod compareTo() klase Osoba za poreenje lanova liste:import java.util.Collections;... main...{// sve kao i ranije Collections.sort(filmCast);System.out.println("\nU abecednom poretku:\n");for(Osoba osoba: filmCast)System.out.println(osoba);sort() metod je u stvari generiki metod i on radi sa proizvoljnim tipom koji implementira Comparable interfejs

  • StekLIFO ( last-in first-out)generiki tip Stack je izveden iz VectorKlasa Stack dodaje 5 metoda onima nasleenim iz VectorT push(T obj) stavlja objekat obj tipa T na vrh steka, vraa referencu koju smo prosledili kao argument T pop() skida objekat sa vrha steka i vraa ga. Referenca se uklanja sa steka. Ako je stek prazan EmptyStackException T peek() vraa element sa vrha steka, ali ga ne skida sa steka (EmptyStackException) int search(Object obj) vraa poziciju na steku reference objekta obj. referenca na vrhu steka je na poziciji 1, sledea na pozicji 2, itd. Ako objekat nije pronaen na steku, vraa se -1.boolean empty() vraa true ako je stek prazan, false inae

  • StekJedini konstruktor je konstruktor bez argumenataon poziva podrazumevani konstruktor bazne klase Vector, pa je inicijalni kapacitet 10 objekata, ali e automatski rasti na isti nain kao za vektorpush() metod za Stack objekat analogan je add() za Vector, to dodaje objekat na kraj vektora. Tako, vrh steka odgovara kraju vektora

  • Stek, primerDeljenjeKarataMoemo koristiti Stack objekat, zajedno sa jo jednim korisnim metodom klase Collections kako bismo simulirali deljenje karata iz pila. Potreban je i nain predstavljanja boja karata i njihovih vrednosti. Tip enum je zadovoljavajui za oba jer ima fiksiran skup konstantnih vrednostiKarta.javaKlasa Karta ima 2 atributa, i oba su tipa enumeracijeString reprezentacija konstante enumeracije je ime koje smo pridruili toj konstanti!U optem sluaju, verovatno e nam trebati da poredimo karte, pa klasa Karta moe da implementira interfejs ComparablecompareTo() metod u klasi Karta: ako su dve karte iste boje, porede se vrednosti. Za poreenje enum vrednosti na jednakost koristimo metod equals()Klasa Enum koja je bazna za sve enum tipove implementira Comparable interfejs, pa koristimo compareTo() metod za utvrivanje redosleda enum vrednosti

  • Stek, primerRuka.javaRuku karata podeljenu iz pila moemo predstaviti objektom tipa Ruka. Taj objekat mora da moe da se prilagodi proizvoljnom broju karata, poto to zavisi od igre za koju je ruka namenjena.Moemo definisati klasu Ruka koristei Vector objekat za smetanje karata.Podrazumevani konstruktor generisan kompajlerom kreirae Ruka objekat koji sadrzi Vector lan, rukadodajemo metod sort() klasi Ruka koji sortira karte u ruciKlasa Karta implementira interfejs Comparable pa moemo koristiti statiki metod sort() klase Collections za sortiranje karata u rucireturn this; vraa tekui Ruka objekat nakon to je sortiranU optem sluaju moda elimo da poredimo ruke, ali to potpuno zavisi od konteksta. Najbolji pristup za ovo bio bi da se iz Ruka izvede ruka specifina za datu igru, npr. PokerRuka i implementira metod compareTo() interfejsa Comparable u toj klasi na nain koji odgovara datoj igri.

  • Stek, primerSpil.javapil je Stack objekat spilmetod values() za tip enum vraa kolekciju koja sadri sve konstante enumeracijepodeliRuku() metod kreira Ruka objekat i zatim skida brojKarata karata sa steka spil i dodaje svaku od njih ruci. Zatim se vraa Ruka objekatPotreban nam je metod za meanje karata pre deljenjaimport java.util.Collections;...Collections.shuffle(spil);...metod shuffle() klase Collections mea sadraj proizvoljne kolekcije koja implementira List interfejs.Klasa Stack implementria interfejs List, pa moemo koristiti metod shuffle() da dobijemo promeani pil Karta objekata.ako koga zanima, vreme potrebno za izvravanje metoda shuffle() je proporcionalno broju elemenata ide se unazad kroz listu i swap-uje tekui element sa sluajno izabranim elementom izmeu prvog i tekueg

  • Stek, primerTestDeljenje.javaRuka mojaRuka = spil.podeliRuku(5).sort();podeliRuku() metod vraa Ruka objekat pomou koga zovemo njegov metod sort()Poto metod sort() vraa referencu na Ruka objekat nakon sortiranja, mogue je u 1 naredbi izvriti deljenje ruke, sortiranje i naredbu dodeleStek objekat je posebno podesan za deljenje karata, poto elimo da uklonimo svaku kartu sa pila poto je podelimo, a to se automatski radi pop() metodomKada treba da proemo kroz sve objekte steka, bez njihovog uklanjanja, koristimo collection-based for petlju, kao sa Vector objektom u toString() metodu klase Ruka. Poto je klasa Stack izvedena iz Vector, svi metodi klase Vector dostupni su i za stek.Korienje steka je veoma jednostavno, a stek je mona alatka u mnogim razliitim kontekstima. Stek je esto primenjen u aplikacijama koje ukljuuju sintaksnu analizu, poput kompajlera i interpretera ukljuujui i one za Javu

  • Povezane listeLinkedList generiki tipimplementira uoptenu povezanu listu2 konstruktora:podrazumevani kreira praznu listusa argumentom tipa Collection koji kreira LinkedList objekat koji e sadrati objekte kolekcije prosleene kao argumentadd(), addAll()addFirst(), addLast()get(), getFirst(), getLast()remove(), removeFirst(), removeLast()set()size()Kao i za Vector objekat, moemo dobiti Iterator pozivom iterator() metoda, a ListIterator objekat pozivom listIterator()Iterator objekat doputa samo kretanje unapred kroz elemente, dok ListIerator objekat omoguuje kretanje u oba smera

  • Povezane liste, primerPRIMER: Moemo izmeniti primer TestPolyline da koristi LinkedList objekat, a ne nau "uradi-sam" verziju.TestPolyLine i Point klase ostaju iste kao i pre, potrebno je samo promeniti definiciju klase PolylineKlasa je sada dosta jednostavnija poto klasa LinkedList obezbeuje svu mehaniku operisanja povezanom listomGlavna izmena se tie klase Polyline i Point objekti su sada smeteni u povezanoj listi implementiranoj LinkedList objektom, polyline.Korienje kolekcijske klase ini klasu Polyline vrlo pravolinijskomPrimer korienja collection-based for petlje sa dvodimenzionim nizom:public Polyline(double[][] coords){ for(double[] xy: coords)addPoint(xy[0],xy[1]);}Dvodimenzioni niz je efektivno jednodimenzioni niz referenci na jednodimenzione nizove od kojih svaki ima po 2 elementa x i y koordinatu take.loop-promenljiva xy je tipa double[] i ima 2 elementa

  • Korienje mapaMapa je nain smetanja podataka koji minimizuje potrebu za pretraivanjem kada elimo da pristupimo objektuSvaki objekat ima pridruen klju koji se koristi za odreivanje gde smestiti referencu na objekat, i objekat i klju se smetaju zajedno u mapuSa datom vrednou za klju, uvek se manje-vie direktno dolazi do objekta odgovarajueg za taj klju

  • Proces heiranjaImplementacija mape u Java collections framework obezbeena klasom HashMap odvojena je od niza u kome se smetaju klju/objekat paroviIndeks za ovaj niz dobija se od kljua korienjem hekoda objekta za raunanje offset-a u nizu za smetanje parova klju/objekatPo default-u, tu se koristi hashCode() metod za objekat klju. Ovaj metod je nasleen u svim klasama od Object, pa je to metod koji generie osnovni hekod osim ako hashCode() metod nije redefinisan u klasi za klju. HashMap klasa ne pretpostavlja da je osnovni hekod adekvatan, pa se on dalje transformie unutar HashMap objekta.Unos u tabeli koja se koristi za smetanje parova klju/vrednost zove se bucket. Hekod dobijen od kljua odreuje bucket u koji e biti smeten par klju/vrednost.

  • Proces heiranjaIako svaki klju mora biti jedinstven, ne mora se od svakog kljua dobiti jedinstven hekod. Kada dva ili vie razliitih kljueva daju istu he-vrednost, to se zove kolizija. HashMap objekat radi sa kolizijama tako to smeta sve klju/vrednost parove sa istom he-vrednou u povezanu listu. Ako se to deava preesto, oigledno dolazi do usporavanja procesa smetanja podataka i pristupanja podacima.Pristup objektu kod koga je prilikom smetanja u mapu dolo do kolizije sastoji se iz 2 faze: klju e biti heiran da se pronae lokacija na kojoj bi par klju/vrednost trebalo da bude. Zatim treba pretraiti povezanu listu, da bi se dolo do kljua koji traimo ( u listi su svi oni kljuevi koji daju istu he-vrednost kao i traeni klju )Zato postoji jak podstrek da se minimizuju kolizije, a cena smanjenja mogunosti kolizija u he-tabeli je mnogo praznog prostora u tabeli.

  • hashCode() metodKlasa Object definie metod hashCode(), pa se svaki objekat moe koristiti kao klju.Metod nije ba univerzalno primenljiv. Poto obino koristi memorijsku adresu na kojoj je objekat smeten za dobijanje he-vrednosti, razliiti objekti uvek proizvode razliite he-vrednosti.To je povoljno jer e operacije nad he-mapom biti efikasnije, meutim ono to nije dobro je to da razliite instance objekta koje sadre identine podatke proizvode razliite he-vrednosti, pa ih ne moemo porediti.To postaje smetnja ako koristimo default hashCode() metod u objektima koje koristimo kao kljueve. U tom sluaju, objektu smetenom u he-mapi nikada se ne moe pristupiti korienjem druge instance objekta kljua, ak i ako je taj objekat klju identian u svim ostalim aspektima. A upravo je to sluaj u veini situacija

  • hashCode() metodNpr. razmotrimo aplikaciju poput jednostavnog adresara. elimo da smetamo unose u mapu bazirano na imenima ljudi na koje se unosi odnose, a elimo da pretraujemo mapu na osnovu imena koja se unose sa tastature.Meutim, objekat koji predstavlja novouneseno ime bie neizbeno razliit od onoga koji je korien kao klju za unos i njegovim korienjem neemo moi da naemo odgovarajui unos za to imeReenje ovog problema bilo bi da se nekako napravi heiranje atributa objekata. Tada, poreenjem vrednosti atributa novog objekta ime sa onima iz objekata imena korienih kao kljueva u he-mapi moi emo da pronaemo odgovarajui unos.

  • Korienje objekata naih klasa kao kljuevaDa bi objekti naih klasa mogli da se koriste kao kljuevi u he-tabeli, mora se predefinisati (override) metod equals() klase Object.Metod equals() prima kao argument objekat iste klase i vraa boolean vrednostOvaj metod se koristi u metodima klase HashMap za utvrivanje da li su 2 kljua jednaka, pa naa verzija ovog metoda treba da vrati true kada dva razliita objekta sadre identine vrednosti atributaTakoe, moemo predefinisati metod hashCode(), koji vraa he-vrednost za objekat kao tip int.

  • Generisanje hekodovaTo je ogromna tema. Kako emo pisati hashCode() metod u svojoj klasi, zavisi od nas, ali taj metod mora ispunjavati neke zahteve da bi bio od koristi.hekod koji vraa metod hashCode() je vrednost tipa int.Treba da se trudimo da vratimo hekod koji ima veliku verovatnou da bude jedinstven za objekat i hekodovi koje generiemo za opseg razliitih objekata sa kojima emo raditi treba da bude to je mogue ire raspodeljen po opsegu int vrednosti.Da bismo postigli jedinstvenost, tipino emo eleti da kombinujemo vrednosti svih atributa u objektu kako bismo dobili hekod. Prvi korak je dobiti integer za svaki atribut. A zatim treba ukombinovati te integer-e za dobijanje vrednosti koja e biti hekod za objekatJedan nain da se ovo uradi jeste da se svaki integer koji odgovara nekom atributu pomnoi razliitim prostim brojem i saberu tako dobijeni rezultati

  • Generisanje hekodovaTo bi trebalo da da razumljivu distribuciju vrednosti sa dobrom verovatnoom da budu razliite za razliite objekteNije bitno koje proste brojeve emo koristiti sve dok:nisu tako veliki da rezultat izae iz opsega tipa intkoristimo razliit prost broj za svaki atributKako od atributa dobiti integer ?Generisanje integer-a za atribute tipa String je prosto: samo pozovemo hashCode() metod za atribut, koji je u klasi String implementiran tako da proizvede dobre hekod vrednosti koje e biti jednake za identine stringove.int atribute moemo koristiti takve kakvi su, dok atributi realnih tipova zahtevaju neto obrade.

  • Generisanje hekodova - primerNpr. elimo da koristimo objekte klase Osoba kao kljueve u he tabeli, a atributi su ime i prezime tipa String i godine tipa intMogli bismo hashCode() metod te klase da implementiramo sa:public int hashCode() { return 13*ime.hashCode() + 17*prezime.hashCode() + 19*godine;}Ako je atribut objekat tipa neke klase, a ne promenljiva primitivnog tipa, treba implementirati hashCode() metod za tu klasu i koristiti ga u raunanju hekoda za klasu kljua.

  • Kreiranje hash-map kontejnerasve map klase implementiraju Map interfejs, pa se objekat proizvoljne map klase moe referisati promenljivom tipa Mapklasa HashMap je dobra za veinu situacijakonstruktori: za kreiranje HashMap objektaHashMap() kreira mapu kapaciteta dovoljnog za podrazumevani broj objekata (16 , a podrazumevani load faktor je 0.75)HashMap(int capacity)kreira mapu zadatog kapaciteta, loadfaktor je 0.75HashMap(int capacity, float loadFactor) kreira mapu zadatog kapaciteta i load faktora kreira mapu sa istim kapacitetom i load faktorom kao to ima mapa prosleena kao argument

  • Kreiranje hash-map kontejneraPrimer: kreiranje mape podrazumevanim konstruktorom: HashMap mapa = new HashMap() ;ovom naredbom se kreira HashMap objekat za smetanje Osoba objekata zajedno sa pridruenim kljuevima tipa Stringcapacity za mapy je broj klju/objekat parova koje ona moe da smesti. Kapacitet se automatski poveava po potrebi, ali to je vremenski zahtevna operacija. capacity vrednost za mapu kombinuje se sa hekodom kljua koji zadamo da bi se izraunao indeks koji odreuje gde e objekat i njegov klju biti smeteni. Da bi ovo izraunavanje dalo dobru distribuciju vrednosti indeksa, kada sami zadajemo kapacitet he-tabele, trebalo bi da koristimo proste brojeve, npr. HashMap mapa = new HashMap(151);

  • Kreiranje hash-map kontejneraBroj smetenih objekata nikada ne moe dostii kapacitet. Uvek je potrebno odvojiti kapacitet za efikasnost operacija. Sa nedovoljno tog dodatog kapaciteta, kolizije postaju verovatnijeload-faktor se koristi za odluivanje kada poveati veliinu he-tabele. Kada veliina tabele dostigne vrednost koja je jednaka proizvodu load-faktora i kapaciteta, kapacitet e automatski biti uvean na dvostruki stari kapacitet +1 ( +1 obezbeuje da je novi kapacitet bar neparan, ako ne i prost).0.75 je dobar kompromis, a ako hoemo da ga smanjimo, moemo koristiti 3. konstruktor: HashMap mapa = new HashMap ( 151, 0.6f ) ;

  • Smetanje, pristup i uklanjanje objekatasve ove operacije sa he-mapom su jednostavne.odgovarajui metodi su:V put(K key, V value)smeta objekat value u mapu korienjem kljua zadatog kao prvi argument, value e ukloniti eventualni postojei objekat i bie vraena referenca na taj stari objekat. Ako prethodno nije smeten objekat ili je smeten null, vratie se null.void putAll( ___ map)prenosi sve parove klju/objekat iz map u tekuu mapu, zamenjujui sve postojee objekte sa istim kljuevimaV remove(Object key)uklanja unos pridruen key ako postoji i vraa referencu na objekat. Vraa se null ako ne postoji takav unos ili je null smeten koristei key.V get(Object key)vraa objekat smeten pomou key. Ako pomou key nisu smetani objekti u mapu ili je smeten null objekat, vraa null. Objekat ostaje u tabeli

  • Smetanje, pristup i uklanjanje objekatametod containsKey() prima key objekat kao argument i vraa true ako je taj klju smeten u mapu. Pomou ovog metoda moe se utvrditi da li je null smeten u mapu pomou datog kljua ili taj klju uopte nije korien za smetanje objekata u mapuNeophodno je osigurati da je vrednost koju vrati put() jednaka null. Inae, moemo nesvesno ukloniti objekat koji je smeten u tabelu korienjem istog kljua.Sledei fragment koda ilustruje kako bi se to moglo uraditi:HashMap mapa = new HashMap();String kljuc = "Perica";int vrednost = 12345;Integer staraVrednost = null;for(int i=0; i
  • Smetanje, pristup i uklanjanje objekataOvde smo mogli izbaciti svoj izuzetak umesto ispisa porukeDrugi parametar put() metoda za objekat mapa bie tipa Integer pa kompajler obezbeuje autoboxing konverziju int vrednosti prosleene kao argumenta123451234612347Kada se smeta prva vrednost, nita nije smeteno od ranije u mapi za taj klju, pa nema poruke. Za sve uzastopne pokuaje smetanja objekata koji slede, prethodni objekat se uklanja i vraa se referenca na njegaget() operacija vraa referencu na objekat pridruen kljuu, ali ga ne uklanja iz tabele

  • Smetanje, pristup i uklanjanje objekataDa bismo pristupili objektu i obrisali unos koji ga sadri iz tabele, moramo koristiti metod remove().int vrednost = mapa.remove(kljuc);ovo uklanja objekat koji odgovara kljuc-u i vraa referencu na njegaAko se ova naredba nadovee na prethodni fragment koda, bie vraena referenca na Integer objekat koji enkapsulira vrednost 12348. Poto to smetamo u promenljivu tipa int, kompajler e ubaciti unboxing konverziju.

  • Procesiranje svih elemenata mapeInterfejs Map obezbeuje 3 naina za dobijanje kolekcije sadraja mape.Mogue je dobiti sve kljueve Map objekta kao objekat tipa Set.Takoe, mogue je dobiti Collection objekat referenci na sve objekte mapeklju/objekat parovi smeteni su u mapi kao objekti tipa koji implementira Map.Entry interfejs. To je generiki interfejsni tip definisan unutar Map interfejsa. Moemo dobiti sve parove klju/objekat iz mape kao objekat tipa SetSet ili Collection objekat koji dobijemo je u sutini pogled na sadraj mape, tako da se promene HashMap objekta odraavaju na pridrueni Set ili Collection , i obrnuto.

  • Procesiranje svih elemenata mapeMetodi:keySet()vraa Set objekat referenci na kljueve mapeentrySet()vraa Set< Map.Entry > objekat referenci na klju/objekat parove; svaki par je objekat tipa Map.Entryvalues()vraa Collection objekat referenci na objekte smetene u mapiSet objekat koji dobijemo keySet() metodom moemo koristiti ili direktno za pristup kljuevima ili indirektno za dobijanje objekata smetenih u mapi

  • Procesiranje svih elemenata mapeZa HashMap objekat mapa, moemo dobiti skup svih kljueva mape sa: Set kljucevi = mapa.keySet();Onda moemo dobiti iterator za ovaj skup kljueva sa: Iterator kljucIter = kljucevi.iterator();moemo koristiti metod iterator() za objekat kljucevi za iteriranje preko svih kljueva mapeMogue je i ukombinovati ove 2 operacije za direktno dobijanje iteratora. Npr. Iterator kljucIter = mapa.keySet().iterator();while(kljucIter.hasNext())System.out.println(kljucIter.next());

  • Procesiranje svih elemenata mapeMoemo koristiti kljueve za izdvajanje objekata, ali Collection objekat koji vrati metod values() obezbeuje direktniji nain za to.Primer listanja objekata smetenih u mapa, pod pretpostavkom da je ona tipa HashMap :Collection kolekcija = mapa.values();for(Integer i: kolekcija)System.out.println(i);Interfejs Set ima Iterable za superinterfejs, pa moemo koristiti collection-based for petlju direktno sa objektom koji vrati metod keySet():Set kljucevi = mapa.keySet();for(String kljuc: kljucevi)System.out.println(kljuc);mnogo zgodnije i itljivije nego sa iteratorom, zar ne ?uopte, collection-based for petlja daje lake razumljiv kd nego iterator

  • Procesiranje svih elemenata mapeNa slian nain kao za skup kljueva, moemo koristiti for petlju za pristup Map.Entry objektima Set objekta koji vrati metod entrySet().Za operisanje Map.Entry objektima na raspolaganju su nam sledei metodi:K getKey()vraa klju za Map.Entry objekatV getValue()vraa objekat za Map.Entry objekatV setValue( V new )postavlja objekat tekueg Map.Entry objekta na argument i vraa originalni objekat. Ovo menja originalnu mapu.(UnsupportedOperationException ako mapa ne podrava put(), ClassCastException, IllegalArgumentException)

  • Procesiranje svih elemenata mapeObjektu Map.Entry takoe je potreban equals() metod za poreenja sa drugim Map.Entry objektom prosleenim kao argumentom, i hashCode() metod za raunanje hekoda za Map.Entry objekat.Sa skupom Map.Entry objekata moemo pristupati kljuevima i odgovarajuim objektima i menjati objekat-deo svakog klju/objekat para, ako je to potrebno

  • Primer, he-mape, ImenikPrimer: vrlo jednostavan imenik koji koristi mapu. Neemo previe brinuti o oporavku od greke da ne bismo optereivali kodImenikklase: Osoba, BrojTelefona, Unos klasa koja predstavlja unos u imeniku kombinacija imena i broja. Moe se dodati i adresa, ali to za demonstriranje principa nije neophodno. Takoe, definiemo i klasu Imenik.Osoba.javaNeophodno je poboljati klasu Osoba koju smo imali u primeru Guzva, tako da njeni objekti postanu upotrebljivi kao kljuevi u mapi koju emo koristiti za smetanje unosa imenikaDodaemo metod equals() i predefinisaemo default hashCode() metod.

  • Imenikda implementiramo metod equals() samo pozovemo compareTo() metod koji smo implementirali za Comparable interfejs.Moemo dodati jo neto korisno, a to je statiki metod koji e uitavati podatke za Osoba objekat sa tastatureBrojTelefona.javaovde se moe izvravati gomila provera validnosti brojeva, ali to za ovaj primer nije od znaajadodajemo statiki metod za uitavanje broja sa tastatureU praksi bi svakako trebalo proveriti korektnost unosa, ali za prikaz kako funkcioniu he-mape, to nije potrebnoUnos.javaunos u imeniku kombinuje ime i broj

  • ImenikImenik.javaza smetanje Unos objekata koristimo HashMap atribut, imenik.Koristiemo Osoba objekat odgovarajui za unos kao klju, pa metod dodajUnos() ima samo da pristupi Osoba objektu Unos objekta koji mu je prosleen i da ga koristi kao prvi argument metoda put() za imenik.TestImenik.java //Da bismo uinili program malo interesantnijim, dodajemo metod za listanje svih unosa iz imenika u abecednom poretku po imenima.1 nain da se to uradi bio bi da se kreira povezana lista unosa i iskoristi sort() metod klase Collections da se oni sortirajumetod sort() oekuje argument tipa List, gde tip elemenata liste implementira interfejs Comparable. Tako, da bismo mogli da sortiramo unose u imeniku, klasa Unos mora da implementira interfejs Comparable.

  • ImenikSada moemo implementirati metod izlistajUnose() u klasi Imenik za listanje unosa u abecednom poretku.to je jednostavno: poziv metoda values() za objekat imenik vraa objekte iz mape, koji su Unos objekti, kao Collection.To prosleujemo konstruktoru klase LinkedList da bismo dobili objekat tog tipa.Klasa LinkedList implementira interfejs List, pa se objekat unosi moe proslediti kao argument metodu sort() na sortiranje.Aurirani main() metod: dodajemo izbor za listanje svih unosa