Java Collections Framework
O colectie reprezinta un obiect care grupeaza mai multe elemente intr-o singura unitate. Colectiile sunt disponibile in limbajul Java prin intermediul pachetului de clase java.util si sunt utilizate pentru a stoca, manipula si transmite date.
In limbajul Java colectiile sunt tratate intr-o maniera unitara, fiind organizate prin intermediul unei arhitecturi care permite reprezentarea si manipularea lor. Aceasta arhitectura este cunoscuta sub numele de Java Collections Framework si cuprinde urmatoarele elemente:
• interfete: tipuri abstracte de date care descriu colectiile; aceste interfete permit utilizarea colectiilor independent de detaliile de implementare;
• implementari: clase concrete care implementeaza interfetele care descriu colectiile;
• algoritmi: metode care efectueaza diverse operatii utile, cum ar fi cautarea sau sortarea; acesti algoritmi sunt definiti pentru clasele care implementeaza interfetele care descriu colectiile.
Colectiile ofera acces la o serie de structuri de date uzuale, precum: multimile, listele, tablourile sau tabelele asociative. Clasele incluse in Java Collections Framework incapsuleaza atat stucturile de date, cat si algoritmii asociati.
Utilizarea elementelor definite pentru lucrul cu colectii prezinta o serie de avantaje, din care pot fi amintite urmatoarele:
• reduc efortul de programare prin oferirea unor tipuri de date si a unor algoritmi care modeleaza structuri si operatii des intalnite;
• cresc viteza si calitatea aplicatiilor prin implementari de inalta performanta;
• maresc gradul de reutilizare a codului prin oferirea unor structuri de date care respecta anumite standarde.
Interfete si implementari
Dupa cum se poate observa si din figura urmatoare, colectiile au la baza doua ierarhii principial diferite, Collection, respectiv Map. Interfetele prezente in ierarhiile Collection si Map prezinta caracteristici specifice.
Interfata Collection modeleaza o colectie la nivelul cel mai general. Permite descrierea unui grup de obiecte care poarta numele de elemente ale colectiei. Limbajul Java nu ofera nici o implementare directa a acestei interfete, ci doar implementari ale unor subinterfete (List, Set, SortedSet).
Interfata List extinde interfata Collection si descrie liste de elemente indexate. O structura de tip List corespunde unui grup ordonat de elemente. Listele permit elementele duplicate, dar si controlul pozitiei elementelor prin indecsi atasati acestora.
Interfata Set extinde interfata Collection si modeleaza notiunea de multime in sens matematic. Structurile de tip Set nu permit elemente duplicate (o multime nu poate avea elemente duplicate). Interfata SortedSet extinde interfata Set si descrie multimi de elemente ordonate ascendent. Aceasta interfata ofera o serie de operatii care beneficiaza de avantajul ordonarii elementelor, precum: extragerea de submultimi sau determinarea primului/ultimului element din multime.
Interfata Map descrie structuri care asociaza fiecarui element o cheie unica, introducand astfel perechi de tip cheie-valoare (tabele asociative). Cheile duplicate nu sunt permise; daca intr-o astfel de structura este adaugat un element a carui cheie este deja utilizata in cadrul structurii, atunci elementul nou il inlocuieste pe cel vechi. Interfata SortedMap extinde interfata Map si descrie perechi de tipul cheie-valoare (tabele asociative) ordonate ascendent dupa cheie.
Pentru lucrul cu colectii de obiecte mai pot fi utilizate interfete aditionale, precum Iterator, care asigura parcurgerea colectiilor intr-o maniera standardizata, independenta de tipul lor.
Pentru gestionarea colectiilor, in pachetul java.util sunt definite o serie de clase specializate, de baza, care implementeaza interfete din ierarhiile Collection si Map. Aceste clase au denumiri de tipul <Implementare><Interfata>, unde implementare se refera la structura de date folosita:
• Hash: utilizeaza o strategie interna de dispersie (hashing) care ofera timpi de regasire apropriati pentru elementele colectiei;
• Linked: utilizeaza o stategie de legare pentru a pastra ordinea de inserare a elementelor; o astfel de structura este optimizata pentru inserare sau stergere si nu pentru adaugare sau iterare;
• Tree: utilizeaza un arbore binar pentru a stabili ordinea elementelor.
Implementarea interfetelor este indirecta, in sensul ca aceste clase concrete extind superclase abstracte (AbstractCollection, AbstractList, AbstractSet, AbstractMap) care ofera implementari concrete pentru majoritatea metodelor definite in interfete. Interfata Collection nu prezinta nici o implementare directa.
Interfata Collection
Interfata Collection modeleaza o colectie de obiecte la nivelul cel mai general. Permite descrierea unui grup de obiecte care poarta numele de elemente ale colectiei.
public interface Collection<E> extends Iterable<E> { | |
int size(); | |
boolean isEmpty(); | |
boolean contains(Object o); | |
Iterator<E> iterator(); | |
Object[] toArray(); | |
<T> T[] toArray(T[] a); | |
boolean add(E e); | |
boolean remove(Object o); | |
boolean containsAll(Collection<?> c); | |
boolean addAll(Collection<? extends E> c); | |
boolean removeAll(Collection<?> c); | |
boolean retainAll(Collection<?> c); | |
void clear(); | |
boolean equals(Object o); | |
int hashCode(); | |
} |
Interfata Collection specifica un numar de metode, precum cele pentru adaugarea si stergerea elementelor, sau cele pentru determinarea numarului de elemente si pentru verificarea apartenentei unui element la colectie.
Metoda | Semnificatie |
---|---|
int size() | returneaza numarul de elemente din colectie |
boolean isEmpty() | returneaza true daca colectia nu contine nici un element |
boolean contains(Object o) | verifica daca in colectie se gaseste obiectul transmis |
Iterator iterator() | returneaza un iterator prin intermediul caruia poate fi parcursa colectia |
Object toArray() | returneaza un tablou care contine elementele colectiei |
boolean add(E e) | adauga la colectie elementul transmis |
boolean remove(Object o) | sterge din colectie obiectul transmis |
boolean containsAll(Collection<?> c) | verifica daca in colectie este inclusa colectia transmisa |
boolean addAll(Collection<? extends E> c) | adauga la colectie toate elementele colectiei transmise |
boolean removeAll(Collection<?> c) | sterge din colectie toate elementele colectiei transmise |
boolean retainAll(Collection<?> c) | pastreaza in colectie doar elementele colecției transmise |
void clear() | sterge toate obiectele colectiei |