Documente Academic
Documente Profesional
Documente Cultură
Autoboxing si unboxing sunt facilitati Java ce permit sa facem atribuiri fara o sintaxa
explicita de cast. Java va face cast-ul la rulare.
Observatie: folosirea autoboxing-ului in cicluri trebuie facuta cu grija pentru ca atrage dupa
sine costuri de performanta.
Colectii Java
In Java colectiile inmagazineaza, grupeaza si sorteaza obiecte. Putem implementa interfete si
extinde clase colectie pentru a defini colectii utilizator. JCF (Java Collection Framework) este
o arhitectura ce pune la dispozitie clase si interfete pentru crearea si manipularea colectiilor.
Asadar, JFC contine:
interfete, unele interfete sunt goale si functioneaza ca markere
implementari, ce asigura dezvoltarea colectiilor utilizator
algoritmi, sunt folositi pentru a rezolva anumite probleme cum ar fi sortarea sau
cautarea intr-o colectie. Algoritmii sunt polimorfici.
O colectie este un obiect destinat sa gestioneze un grup de obiecte:
- un obiect din colectie se numeste element
- primitivele nu sunt permise intr-o colectie
Avantajele folosirii JCF:
ofera colectii predefinite cum ar fi multimile, tabelele de distributie si hartile
faciliteaza referirea cu ajutorul interfetelor
reduce efortul de design si implementare
Avem colectii de diferite tipuri ce implementeaza multe structuri de date comune: stive, cozi,
siruri dinamice, tabele de distributie.
Interfetele colectie formeaza o ierarhie. Radacina este formata din Collection. Elementele
unei Collection pot fi sortate sau nu si pot contine duplicari. Nu exista implementari directe
ale acestei interfete. Toate colectiile pot fi traversate folosind sintaxa foreach. Subinterfete
derivate sunt:
Set, este o colectie ce nu poate contine duplicari si poate contine cel mult un element
null. Set-ul nu are index.
o interfata direct derivata din Set este SortedSet in care elementele sunt, in plus,
ordonate natural (dupa codurile caracterelor). TreeSet furnizeaza o implementare
sortata
direct derivata din SortedSet este interfata NavigableSet, care adauga metode de
navigare bidirectionala (crescator sau descrescator) a multimii si returneaza elemente
ce se potrivesc intr-o oarecare masura unui sablon de cautare. Exemplu de folosire a
lui NavigableSet:
public static void main(String args[]) {
//cream o SortedSet ca instanta a unei clase TreeSet
SortedSet<String> s=new TreeSet<>();
//cream un NavigableSet
NavigableSet<String> n=(NavigableSet<String>)s;
//adaugam elemente
n.add("ion");
n.add("Ion");
n.add("Vasile");
n.add("vasile");
n.add("gelu");
System.out.println("afisare in ordine crescatoare");
Iterator<String> a=n.iterator();
while(a.hasNext()){
System.out.println(a.next());
}
System.out.println("afisare in ordine descrescatoare");
Iterator<String> d=n.descendingIterator();
while(d.hasNext()){
System.out.println(d.next());
}
}
List,
Map
in
ordinea crescatoare sau descrescatoare a cheii.
Interfata ConcurrentNavigableMap extinde atat ConcurrentMap cat si
NavigableMap. Astfel, interfata furnizeaza metode de navigare ce returneaza cea mai
apropiata potrivire a unui sablon dat, precum si traversarea bidirectionala, atat in
ordine crescatoare cat si descrescatoare. Interfata este thread safe.
In 6.0 au fost adaugate urmatoarele clase ce implementeaza unele dintre interfetele anterioare:
ConcurrentSkipListSet, implementeaza NavigableSet. Elementele sale sunt
sortate dupa ordinea naturala sau printr-un Comparator, furnizat la instantiere. Nu
sunt permise valori null
ConcurrentSkipListMap, implementeaza ConcurrentNavigableMap si are o
functionalitate asemanatoare cu ConcurrentSkipListSet. Nu sunt permise valori
null pentru chei
LinkedBlockingDeque, implementeaza BlockingDeque. Are un constructor cu
parametru intreg pentru a specifica capacitatea maxima. Daca nu este specificata
aceasta va fi Integer.MAX_VALUE
AbstractMap.SimpleEntry este folosita pentru a crea o mapare utilizator, in care un
obiect Entry este utilizat pentru gestiunea maparilor. Metoda setValue() este
folosita pentru modificarea valorilor
JCF este sustinuta de anumite interfete auxiliare ce se gasesc in pachetul java.util. Aceste
interfete ne permit sa manipulam elementele unei colectii. Acestea sunt:
RandomAccess este o interfata marker folosita de liste pentru a inlesni accesul rapid la
elemente listelor cu acces secvential sau aleator. Implementari ca Vector sau
ArrayList folosesc aceasta interfata
Comparable ce contine metoda compareTo() si permite doar o optiune de sortare
Comparator ne asigura ca o colectie este ordonata folosind o operatie de ordonare
utilizator. Interfata are doua metode compare() (returneza un intreg) si equals()
(returneza un boolean). Ne permite definirea mai multor optiuni de sortare. Este
implementata partial de clasa abstracta Collator.
Iterator permite parcurgerea inainte intr-o colectie. Are metodele next(),
hasNext() si remove(). Iteratorul unifica accesul la colectii
ListIterator este o extensie a Iterator si permite navigarea in ambele directii. Are
metodele add(), remove() si set() pentru manipulare, next() si previous() pentru
parcurgere, nextIndex() si previousIndex() ce returneza indexul si hasNext() si
hasPrevious() pentru a verifica daca mai exista un element dupa respectiv inaintea
elemetului specificat
Interfata List este implementata de clasele ArrayList, LinkedList si Vector. Metodele
interfetei sunt:
add(element), add(index,element) adauga elementul specificat la sfarsitul listei
sau la un index specificat.
try {
// adauga un element in lista
listaNume.add(nume);
}
// tartarea exceptiilor posibil a aparea
catch (UnsupportedOperationException e) {
System.out.println("Unsupported operation");
} catch (ClassCastException b) {
System.out.println("Class cast");
} catch (NullPointerException n) {
System.out.println("Null pointer");
} catch (IllegalArgumentException t) {
System.out.println("Illegal argument");
}
}
private static boolean removeName(String nume) {
if (checkName(nume))
// indeparteaza un element din lista
return (listaNume.remove(nume));
else
return false;
}
// utilitar pentru obtinerea unui nume de la intrare
private static String getName() {
String name = "";
try {
System.out.print("Nume: ");
name = query.readLine();
} catch (IOException e) {
System.out.println("Invalid name entry");
}
return name;
}
private static void printCommands() {
System.out.println("1: numara cuvinte");
System.out.println("2: sorteaza cuvinte");
System.out.println("3: cauta cuvant");
System.out.println("4: insereaza cuvant");
System.out.println("5: sterge cuvant");
System.out.println("6: afiseaza lista de optiuni");
System.out.println("0: Exit");
}
public static void main(String args[]) {
boolean gata = true;
printCommands();
while (gata) {
try {
System.out.print("Comanda: ");
int argType = Integer.parseInt(query.readLine());
switch (argType) {
case 0: {
gata = false;
break;
}
case 1: {
getWordCount();
break;
}
case 2: {
outputSortedList();
break;
}
case 3: {
checkName(getName());
break;
}
case 4: {
insertName(getName());
break;
}
case 5: {
removeName(getName());
break;
}
case 6: {
printCommands();
break;
}
default: {
System.out.println("Comanda invalida");
break;
}
}
} catch (Exception e) {
System.out.println("Operatie invalida, programul va
iesi" + e.getMessage());
System.exit(0);
}
} // while
} // main
} // class
accesare de la cea mai recenta cheie accesata la cea mai demult accesata. Clasa
poate fi implementata ca un cash.
o HashSet, TreeSet si LinkedHashSet ce implementeaza interfata Set.
TreeSet utilizeaza o iteratie logaritmica pentru operatii ca adaugarea si
stergerea. Ordinea elementelor ramine aceeasi. In 6.0 TreeSet implementeaza
si interfata NavigableSet. Daca ordinea elementelor adaugate intr-un TreeSet
nu este importanta putem folosi HashSet. LinkedHashSet contine o iteratie
ordonata, dar de costuri mai mici decat TreeSet. Ordinea este de la ultimul
adaugat element la cel mai recent adaugat.
o ArrayList si LinkedList, implementeaza interfata List. ArrayList este mai
rapida decat LinkedList pentru ca utilizeaza metoda locala
System.arraycopy() si ofera timp de acces constant. Adaugarea se face
printr-o operatie de complexitate amortizata. Ordinea elementelor ramine
aceeasi. Celelalte operatii se executa in timp linear
o PriorityQueue, implementeaza interfata Queue si este o coada ordonata ce
foloseste o structura de heap pentru prioritati. Poate fi ordonata in ordine
naturala sau prin implementarea unui Comparator. Capul cozii este accesat
prin metode ca: poll(), remove() sau peek()
o ArrayDeque, implementeaza interfata Deque si este redimensionabila. Nu este
thread safe.
o Hashtable, implementeaza interfata Map. Este identica cu HashMap, dar este
sincronizata si nu poate avea elemente null. Hashtable inmagazineaza
elemente printr-o cheie asociata, ceea ce inseamna acces rapid atunci cand
lucram cu cantitati mari de date. Ordinea elementelor ramane constanta de-a
lungul timpului.
Implementari comode sau mini-implementari, contin in general metode statice:
o Collections.EMPTY_SET, Collections.EMPTY_MAP si
Collections.EMPTY_LIST, reprezinta un SET, MAP respectiv LIST, vide. Pot fi
utilizate ca date de intrare pentru metode, atunci cand nu dorim sa transmitem
valori. Acestea sunt nemodificabile
o Collections.singleton, returneza un SET nemodificabil ce contine doar un
singur element
o Collections.nCopies, returneza un LIST nemodificabil ce contine copii ale
aceluiasi element. Exemplu: List l = new
ArrayList(Collections.nCopies(100, "vaca")); Am creat o lista ce
contine de 100 de ori cuvantul vaca
o Array.asList, returneza un LIST de dimensiune fixa. Orice adaugare sau
stergere arunca o UnsupportedOperationException pentru ca dimensiunea
este nemodificabila.
Implementari Wrapper, contin metode factory (care reprezinta un fel de constructor
generic pe care il putem folosi pentru a crea mai multe tipuri de instante ale claselor)
statice ce impacheteaza colectiile actuale si aduc extra functionalitati. Avem
urmatoarele categorii de wrapperi:
o Nemodificabili: previne modificarea colectiei de catre utilizator prin aruncarea
unei exceptii UnsupportedOperationException in cazul in care s-ar intampla
acest lucru. Prin aceasta marim securitatea structurii de date, facand-o readonly. In aceasta categorie avem urmatoarele metode:
public static Collection unmodifiableCollection(Collection c);
public static Set unmodifiableSet(Set s);
public static List unmodifiableList(List list);
static
static
static
static
static
static
o valoare <=0. Doar elementele intarziate pot fi obtinute din coada. In capul
cozii se afla elementul ce a expirat cel mai recent
o SynchronousQueue este o clasa in care nu putem insera un element pina cand
un alt fir nu incearca sa-l extraga
o LinkedBlockingDeque, implementeaza interfata BlockingDeque sub forma
unor noduri inlantuite
o ConcurrentHashMap, este o implementare a interfetei ConcurrentHashMap.
Operatiunile de regasire nu presupun blocarea si nu avem suport pentru
blocarea intregii structuri in vederea accesului
o ConcurentSkipListMap, este o implementare a interfetei
ConcurrentNavigableMap. Ordinea este cea naturala sau data de furnizarea
unui Comparator
Implementari abstracte
o AbstractCollection, ofera o implementare de baza a interfetei Collection
si nu este nici Set si nici List. Trebuie implementate metodele size() si
o
o
o
o
o
iterator()
AbstractSet,
Metoda hashCode()
Este membra a clasei Object si este folosita pentru a genera o valoare intreaga pentru orice
obiect. Fiecare obiect genereaza si inmagazineaza o unica valoare hashcode pe post de cheie.
Sintaxa metodei folosita pentru asa ceva este:
public int hashCode(Object);
Valoarea returnata este mai mare sau egala cu zero, reprezentand indexul cheii, daca cheia
este gasita sau un rezultat negativ, altfel.
Avem trei algoritmi cu ajutorul carora manipulam datele unei liste.
public static <T> void fill(List<? super T> list, T obj), ceea ce
determina initializarea tuturor elementelor listei cu valoarea celui de-al doilea
parametru
public static void reverse(List<?> list), rearanjeaza in ordine inversa
elementele listei. Ruleaza in timp liniar si arunca o
UnsupportedOperationException daca lista nu suporta setari
public static <T> void copy(List<? super T> dest, List<? extends T>
src), suprascrie o lista destinatie cu toate elementele dintr-o lista sursa
finalize()
Name: eclipse-jmx
URL: http://eclipse-jmx.googlecode.com/svn/trunk/net.jmesnil.jmx.update/
1. Sa se scrie o clasa derivata din ArrayList care poate fi parcursa in ordine naturala,
dar si in doua ordonari custom: din trei in trei sau in ordinea, primul,ultimul, al doilea,
penultimul, etc.
3 iteratori: din 1 in 1; din 3 in 3 int iterator = -3; si capetele
Declarare de clase interne implements Iterator- constructor has next->boolean remove ; interfata iterator
2. Se da o lista de coduri de produse (ex: "1S01", "1S02", "1M01", "1S01", etc) si o
descriere a fiecarui cod sub forma: ("Tricou Albastru", "1S01"), ("Tricou Negru",
"1S02") etc. Sa se creeze un program eficient pentru obtinerea unui raport ce cuprinde
descrierea fiecarui produs si numarul de aparitii in lista de coduri. Raportul va fi
ordonat alfabetic dupa descriere
//Clasa produse( )
HashMap StringString( vezi curs )
3. Folositi o structura de date Deque, ca stiva, pentru a testa ca parantezele rotunde se
inchid corect intr-o expresie data de un String. Ca date de intrare vor fi mai multe
expresii, considerate constante (ex: if ((a == b) && (x != y));, if ((a ==
b) && (x != y)));). Testul va afisa un mesaj de forma:
Expresia 1 corect
Expresia 2 false ....