Sunteți pe pagina 1din 23

Java 1 Modul 9

9.1 Tipuri generice

Tipurile generice reprezinta entitati abstracte, care nu au definit un prototip, dar care pot fi
tratate in interiorul unei clase, pentru ca mai apoi sa fie precizat cu exactitate prototipul la care se
refera. In felul acesta poate fi creat un nou pototip flexibil, ale carui tipuri de atribute sunt
dinamice, putand fi modificate de la o instanta la alta. Sa presupunem urmtorul scenariu:
Clasa Animal defineste instante ce au ca unul dintre atribute chiar instante de animale. Insa
Animal este si cainele si tigrul si pisica. Cum poate fi creata o clasa care sa definesca instante in
care un atibut sa aiba mai intai tipul Caine, apoi Tigru si in cele din urma Pisica;

Clasa Animal defineste un prototip ce are ca atribut un tip generic (abstrct / neprecizat la
definire):

1
In clasa Main sunt definite trei instante diferite de Animal:

In acest fel se spune ca atributul clasei generice este dinamic. Atributul generic poate lua orice
tip, atata timp cat va fi precizat la instantiere:

2
Datorita faptului ca sunt neprecizate ca prototip, tipurile generice nu pot face parte din tipuri
statice. Acestea pot fi tratate in clasa doar ca atribute (tipuri non-statice). De asemenea nu poate
fi instantiata o matrice de tipuri generice:

Tipurile generice pot fi folosite in parametrii metodelor non-statice dar si ca tipuri de return:

3
O clasa poate defini mai multe tipuri generice. Acestea vor fi separate prin virgula:

9.2 Mostenirea tipurilor generice

Un tip generic poate fi definit ca mostenitor al unei alte clase pentru a restrange dinamismul
dat tipului. In felul acesta poate fi creata o restrictie a tipului cu care poate fi instantiat genericul;
De exemplu in situatia de mai jos atributul dat genericului trebuie sa se afle in arborele de
mostenire al clasei JPanel, sub aceasta pentru a putea inlocui tipul abstract:

4
La instantiere:

5
Tipul generic in acest caz poate fi instantiat cu orice clasa ce mosteneste JPanel:

Totusi, spre deosebire de ultimul exemplu (clasa Animal), tipul generic nu mai poate fi dat de
orice clasa:

6
Un tip generic poate fi mostenit la definire. In acest fel poate fi creata o dependinta intre
tipurile generice ale unei clase:

9.3 Colectii

Pachetul java.util ofera un set de interfete si clase numite Java Collections Framework cu
ajutorul carora, instante de diferite tipuri pot fi grupate in entitati numite colectii asupra carora se
pot efectua algoritmi. Cele mai importante interfete si clase din Java Collections Framework sunt:
Interfete:

 Collection
 List
 Set
 Queue
 SortedSet
 NavigableSet
 Map
 SortedMap
 NavigableMap

7
Clase:

 HashSet
 ArrayList
 Vector
 LinkedList
 TreeSet
 Hashtable
 HashMap
 TreeMap

Clase de algoritmi:

 Arrays
 Collections

Sunt patru tipuri de colectii:

 Liste - grupuri de entitati


 Multimi (Sets) - grupuri de entitati unice
 Map - grupuri de entitati identiicate cu un ID unic
 Queues (Cozi) - entitati ordonate intr-un mod in care urmeaza sa fi procesate

9.4 Collection, List, Set, Map si Queue

Interfata Collection este radacina intregului arbore ce reprezinta frameworkul Collection. O


colectie reprezinta un grup de obiecte denumite general elemente.
Interfata List defineste o lista. O lista este o colectie de elemente ordonate, identificate printr-
un id. Elementele pot fi accesate prin intermediul identificatorului, pot fi parcurse sau scoase din
lista. Lista permite adaugarea elementelor duplicat. Interfata List defineste un tip generic E
(element) care poate fi precizat la crearea listei.

8
Interfata Set defineste o colectie similara unei multimi matematice. Un obiect poate fi adaugat
sau scos din colectie. Colectia nu permite adaugarea elementelor egale (pentru care metoda
equals() returneaza true). De asemenea poate fi verificat faptul ca un element apartine unui Set.

Interfata Map defineste doua tipuri generice K si V. K se numeste key (cheie) si V se numeste
value (valoare). Colectia atribuie unei chei un element ca valoare.

9
Interfata Queue defineste o interfata similara unei structuri de coada. Queue contine metode
care adauga un element la capatul cozii, care preia primul element din coada si il sterge sau care
doar preia primul element din coada. O coada functioneaza standard pe principiul FIFO (First In
First Out).

9.5 List

Pentru instantierea unei liste este folosita una dintre clasele:

 ArrayList - folosita in principal pentru parcurgeri rapide, aceasta clasa defineste ceva
similar unei matrici care poate creste dinamic.
 Vector - una dintre cele mai vechi colectii Java. Este similara cu ArrayList dar metodele
definite de aceasta clasa sunt sincronizate pentru siguranta apelului in fire de executie
separate
 LinkedList - Similara unei liste inlantuite. Fiecare element are legatura cu doi vecini. Clasa
poate fi usor folsita pentru implementarea structurilor de coada si stiva.

10
Folosirea clasei Vector:

Clasa LinkedList:
Instantele LinkedList pot fi de asemenea folosite cu o zona de memorie a interfetei List pentru
a restrage metodele la cele ale interfetei. De asemenea clasa poate fi instantiata in propria zona
de memorie ce ofera posibilitatea accesului si la alte metode comportament specifice:

11
Metode din clasa LinkedList:

 add(E e);
 addFirst(E e);
 addLast(E e);
 getFirst();
 getLast()
 removeFirst()
 removeLast()

9.6 Set

Interfata Set nu permite duplicate in elementle adaugate colectiei. Pentru instantiere este
folosita una dintre clasele:

 HashSet
 LinkedHashSet
 TreeSet

12
Clasa HashSet foloseste un hash pentru identificarea elementelor. Clasa poate fi folosita pentru
definirea unei colectii care nu ordoneaza elementele si nu permite duplicat in inregistrari.

Se poate observa din exemplu ca elementele nu sunt ordonate cat si ca acestea nu pot fi
adaugate duplicat.
Clasa LinkedHashSet defineste o structura HashSet in care elementele sunt ordonate.
Elementele vor fi afisate in ordinea introducerii.

13
In continuare nu este permisa adaugarea elementelor egale.

Clasa TreeSet descrie o colectie de tip set sortata. O colectie sortata aranjeaza elementele la
introducere dupa un algoritm. TreeSet este un arbore binar echilibrat. Algoritmul dupa care
elementele sunt ordonate este Red-Black Tree.

14
9.7 Map

Collectia de tipul Map identifica printr-o cheie unica valori adaugate. Fiecare element este o
pereche "key-value". Clasele care pot fi folosite pentru a crea o astfel de colectie sunt:

 HashMap
 Hashtable
 LinkedHashMap
 TreeMap

HashMap este cea mai simpla colectie de tip Map. Aceasta nu sorteaza si nu ordoneaza
elementele.

Se observa faptul ca elementele nu sunt ordonate dupa adaugare si nici sortate. Cheile pot fi
obinute si parcurse cu un Iterator. Cheia este unica, prin urmare in functie de aceasta poate fi
preluata valoarea.

15
Clasa Hashtable este, similar clasei Vector, una dintre cele mai vechi clasedin Java API. In
prezenta versiune, clasa defineste o tabela de dispersie similar clasei HashMap, dar ofera metode
sincronizate pentru folosirea colectiilor din mai multe fire de executie in desfasurare.
Colectia LinkedHashMap este similara colectiei HashMap, dar ordoneaza elementele dupa
ordinea introducerii:

TreeMap defineste o colectie sortata si ordonata de tip Map.

9.8 Clasa Collections

Clasa Collections din pachetul java.util defineste algoritmi ca metode de clasa ce pot fi folosite
asupra colectiilor.
Sortarea unei liste:

16
Ordonare inversa:

Amestecarea (shuffle):

17
Extragerea minimului sau a maximului:

18
Rotatia elementelor:
Initial:

Dupa ciclarea cu 4 elemente:

19
Interschimbarea a doua elemente (swap):

10.9 Fire de executie

Firele de executie pot fi imaginate ca secvente de instructiuni ce se desfasoara in paralel


independent in cadrul unui proces.
Instructiunile executate de un fir de executie (numit Thread) au acces la aceleasi zone de
memorie. Firele de executie sunt create fie prin mostenirea claseiThread, fie prin implementearea
interfetei Runnable. Orice clasa care mosteneste Thread sau implementeaza Runnable defineste
instante care pot porni un fir de executie. Instructiunile firului de executie sunt date de
comportamentul run() ce trebuie suprascris din clasa Thread sau din interfata Runnable. Exemplul
de mai jos defineste un fir de executie prin mostenirea clasei Thread:

20
Dupa crearea unei instante a unui fir de executie, pentru a porni firul de executie se apeleaza
metoda start(), comportament al instantei firului de executie mostenit de la clasa Thread.

Fiecare instanta reprezinta un fir de executie ce poate fi pornit:

21
Ultimul exemplu, din imaginea de mai sus reprezinta un program cu trei fire de executie. Unul
este firul principal de executie din care sunt pornite alte doua. instructiunile celor trei fire de
executie dupa pornirea fiecaruia se desfasoara simultan, independent unul de celalalt.
Metoda sleep() , definita static in clasa Thread poate fi folosita pentru adormirea firului de
executie timp de un numar de milisecunde. Exista urmatoarele doua supraincarcari ale metodei
sleep():

 sleep(int milisecunde)
 sleep(int milisecunde, int nanosecunde)

In exemplul de mai jos, firul de executie este adormit 300 milisecunde dupa fiecare iteratie a
ciclului for. Metoda arunca o exceptie de tip InterruptedException, care trebuie tratata pentru
apelul metodei;

9.10 Implementarea interfetei Runnable

Metoda de creare a unui fir de executie prin implementarea interfetei Runnable poate fi utila
atunci cand clasa care trebuie sa devina fir de executie mosteneste deja o alta clasa:

22
Se poate crea instanta Thread pe baza instantei Runnable (fereastra care implementeaza
Runnable), iar apoi firul poate fi pornit cu metoda start().

CuprinsInchidere

23