Sunteți pe pagina 1din 12

OOP11 - M. Joldo - T.U.

Cluj 1
Programare orientat pe obiecte
1. Applet-uri
2. Coleciile Java
OOP11 - M. Joldo - T.U. Cluj 2
Ce este un applet Java?
Applet-urile sunt pur i simplu programe Java care
ruleaz n browsere de web.
Au fcut mare vlv pe la mijlocul anilor 90 cnd
Netscape a fost de acord s includ JVM browserul
de Web "Navigator".
Marea promisiune aplicaiile s poat fi
distribuite automat oricui, pe orice platform!
Realitatea suportul din browsere este neuniform,
au aprut limitri impuse se securitate, au aprut
alte modaliti mai simple de a face acelai lucru!
OOP11 - M. Joldo - T.U. Cluj 3
Ce este un applet Java?
nc util n situaia potrivit
client decorat, dezvoltat
poate face presupuneri/avea un anumit control asupra
tehnologiei client
De asemenea, foarte util pentru nelegerea
problemelor din programarea client-server pe Web
Altfel, programarea pe partea de server cu HTML sau
scenarii ("scripting", folosind d.e. JavaScript) pe partea
de client este mai avantajoas.
De asemenea, Java WebStart noua alternativ
permite descrcarea aplicaiilor prin browser i rularea
lor independent de browser, folosind JVM din sistemul
respectiv.
OOP11 - M. Joldo - T.U. Cluj 4
Utilizarea practic a applet-urilor
Applet-urile au utilizri serioase pe intranet-uri. Motive:
Intranet-urile corporaiilor sunt sigure i administrate -> multe din
restriciile de securitate normale pot fi relaxate.
Uurina administrrii. Un numr mare de aplicaii foarte mici
distribuite peste foarte multe maini poate crea o problem de
administrare (d.e. actualizarea periodic) utilizatorii mai puin
capabili le pot muta, deteriora sau terge. Applet-urile de pe un
server central, ncrcate la cerere, nu au aceast problem (dei
este nevoie s se ntrein browserele, plug-in-urile etc.).
Lrgimea de band mare. Reelele interne au n general lrgimi
mari de band aceasta nseamn c ncrcarea repetat chiar a
applet-urilor mari poate s nu fie o problem.
Reprezint nc o tehnologie viabil pentru aplicaii care au
nevoie de o interfa mai robust dect aceea dintr-o
pagin HTML cu JavaScript.
OOP11 - M. Joldo - T.U. Cluj 5
Arborele de descenden pentru Applet
Folosii-l pentru a
accesa componente
Swing
Object
Component
Container
Window
Frame
JFrame
Panel
Applet
JApplet
java.applet
java.awt
java.lang
javax.swing
OOP11 - M. Joldo - T.U. Cluj 6
Diferene eseniale ntre applet-uri i
aplicaiile de sine stttoare
ntotdeauna se creeaz o instan a applet-ului, iar
constructorul su, init, i metoda start este
executat ntotdeauna.
Pentru c o instan de Applet este o instan de
Panel (iar JApplet extinde Applet), se
creeaz o component vizibil, sunt tratate
(potenial) evenimentele awt etc.
La invocarea unei aplicaii de sine stttoare, se
execut numai public static void main(
String[] ) (i codul apelat de acesta).
OOP11 - M. Joldo - T.U. Cluj 7
Metodele unui applet
Fiecare applet are 5 metode standard :
init() apelat de browser cnd applet-ul este
ncrcat n memorie
start() apelat de browser pentru a porni
animaiile care se execut atunci cnd applet-ul este
(din nou) vizibil
stop() apelat de browser pentru a opri animaiile
n execuie atunci cnd applet-ul este acoperit sau
minimizat
destroy() apelat de browser imediat nainte de a
distruge applet-ul
paintComponent() apelat de browser atunci cnd
applet-ul este desenat sau redesenat
OOP11 - M. Joldo - T.U. Cluj 8
Metodele unui applet
Metodele unui applet vor fi invocate ntotdeauna n
ordinea init, start, stop, destroy ciclul de via al
appletului
start i stop pot fi apelate de multe ori pe durata de
via a unui applet
Toate cele 5 metode sunt implementate fr coninut n
clasa JApplet, iar aceste metode sunt motenite de toate
applet-urile
Applet-urile suprascriu numai metodele de care au nevoie
pentru a-i ndeplini funciile
Applet-ul are o fereastr de stare (dedesubt)
Informeaz ce face applet-ul n momentul respectiv
Pentru a scrie in fereastra de stare folosii metoda showStatus
cu un argument String
OOP11 - M. Joldo - T.U. Cluj 9
Crearea unui applet
Pentru a crea un applet bazat pe Swing:
Crem o subclas a lui JApplet pentru a pstra
componentele GUI
Alegem un gestionar de aranjare pentru container, dac
gestionarul implicit ((BorderLayout; aranjarea implicit
este FlowLayout pentru Applet) ) nu este acceptabil
Crem componentele i le adugm la panoul de
coninut (content pane) al containerului JApplet.
Crem obiecte asculttor pentru a detecta i a
rspunde la evenimentele ateptate de fiecare
component GUI i asignm asculttorii componentelor
corespunztoare.
Crem un fiier text HTML pentru a preciza browser-ului
care applet Java trebuie ncrcat i executat
OOP11 - M. Joldo - T.U. Cluj 10
Exemplu: crearea unui applet
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FirstApplet extends JApplet {
// Instance variables
private int count = 0; // Numarul de apasari
private JButton pushButton; // Buton care se apasa
private JLabel label; // Eticheta
// Initialization method
public void init() {
// Set the layout manager
getContentPane().setLayout( new BorderLayout() );
// Create a label to hold push count
label = new JLabel("Push Count: 0");
getContentPane().add( label, BorderLayout.NORTH );
label.setHorizontalAlignment( label.CENTER );
// Create a button
pushButton = new JButton("Test Button");
pushButton.addActionListener( new ButtonHandler(this) );
getContentPane().add( pushButton, BorderLayout.SOUTH );
}
// Method to update push count
public void updateLabel() { label.setText( "Push Count: " + (++count) ); }
}
Acest applet simplu
implementeaz init i
moteneste toate
celelalte metode far
efect
Remarcai c toate
componentele sunt
adaugate la
ContentPane al
JApplet
OOP11 - M. Joldo - T.U. Cluj 11
Exemplu: crearea unui applet
class ButtonHandler implements ActionListener
{
private FirstApplet fa;
// Constructor
public ButtonHandler ( FirstApplet fa1 )
{
fa = fa1;
}
// Execute when an event occurs
public void actionPerformed( ActionEvent e )
{
fa.updateLabel();
}
}
<html>
<applet code="FirstApplet.class" width=200 height=100>
</applet>
</html>
Clas asculttor
pentru buton pe
applet
cod HTML pentru
lansarea applet-ului in
browser OOP11 - M. Joldo - T.U. Cluj 12
Parametri pentru applet-uri
Parametrii sunt stocai ca parte a paginii de Web care conine applet-
ul.
Parametrii sunt creai folosind eticheta HTML <PARAM> i cele dou
atribute ale sale: NAME i VALUE.
Pot exista mai multe etichete <PARAM> pentru un applet. Toate
trebuie incluse ntre eticheta de nceput <APPLET> i cea de sfrit
</APPLET>. Exemplu cu mai muli parametri:
<APPLET CODE="ScrollingHeadline.class" HEIGHT=50 WIDTH=400>
<PARAM NAME="Headline1" VALUE="Highest marks assigned">
<PARAM NAME="Headline2" VALUE="All people took part">
</APPLET>
Atributul NAME se folosete pentru a da un nume parametrului.
Atributul VALUE d parametrului numit o valoare.
Obinerea parametrilor:metoda getParameter. D.e.
String display1 = getParameter("Headline1");
OOP11 - M. Joldo - T.U. Cluj 13
Etichete HTML pentru applet-uri
<APPLET
[CODEBASE = URLbazaPentruCod]
CODE = fisierApplet
[ATL = textAlternativ]
[NAME = numeInstantaApplet]
WIDTH = latimeInPixeli HEIGHT = inaltimeInPixeli
[ALIGN = alignment]
[VSPACE = spatiuVertInPixeli] [HSPACE =
spatiuOrizInPixeli]
[<PARAM NAME = numeParametru1 VALUE = valoareParametru1>]
[<PARAM NAME = numeParametru2 VALUE = valoareParametru2>]
...
[<PARAM NAME = numeParametrun VALUE = valoareParametrun>]
[HTML care va fi afisat in absenta Java]
</APPLET>
OOP11 - M. Joldo - T.U. Cluj 14
Locul n care se afl fiierele clas
pentru applet-uri
Dac un applet folosete o
clas care nu se afl ntr-un
pachet, clasa respectiv
trebuie s fie prezent n
acelai director ca i fiierul
HTML folosit pentru lansarea
applet-ului
Acest director poate fi local
sau la distan nu conteaz
Fiierele clas pot fi
transferate peste reea, aa c
ar trebui s fie mici
OOP11 - M. Joldo - T.U. Cluj 15
Folosirea pachetelor mpreun cu
applet-uri
Dac un applet folosete un
pachet ne-standard, atunci
pachetul trebuie s apar n
subdirectorul corespunztor
al directorului care conine
fiierul HTML.
Acest director poate fi local
sau la distan nu
conteaz
Variabila de mediu
CLASSPATH este ignorat
de applet-uri!
Location of class
oop.io.Fmt within package
oop.io
OOP11 - M. Joldo - T.U. Cluj 16
Crearea programelor duale Aplicaie /
Applet
Dac o aplicaie nu are nevoie de operaii de
I/E sau s execute alte sarcini restricionate,
atunci ea poate fi structurat pentru a rula att
ca applet ct i ca aplicaie
Proiectm programul ca applet
Adugm o metod main cu apeluri la init i
start
Adugm apeluri la stop i destroy n
metoda windowClosing a rutinei de tratare
pentru fereastr
Un astfel de program poate fi mai versatil
OOP11 - M. Joldo - T.U. Cluj 17
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import chapman.io.*;
public class TempConversionApplet extends JApplet {
// Variabile instanta
private JLabel l1, l2; // Etichete
private JTextField t1, t2; // Cmpuri text
private DegCHandler cHnd; // Tratare ActionEvent
private DegFHandler fHnd; // Tratare ActionEvent
// Metoda de initializare
public void init() {
...
}
Dualitate Aplicaie / Applet
metoda init din applet
OOP11 - M. Joldo - T.U. Cluj 18
// Main method to create frame
public static void main(String s[]) {
// Creeaza un cadru care sa contina aplicatia
JFrame fr = new JFrame("TempConversionApplet ...");
fr.setSize(250,100);
// Creeaza+initializeaza un obiect TempConversionApplet
TempConversionApplet tf = new TempConversionApplet();
tf.init();
tf.start();
// Creeaza un ascultator pentru Window care sa
// trateze evenimentele "close"
AppletWindowHandler l = new AppletWindowHandler(tf);
fr.addWindowListener(l);
// Adauga obiectul in cetrul cadrului
fr.getContentPane().add(tf, BorderLayout.CENTER);
// Afiseaza cadrul
fr.setVisible( true );
}
}
Dualitate Aplicaie / Applet
metoda main
apeleaz init i
start
OOP11 - M. Joldo - T.U. Cluj 19
Dualitate Aplicaie / Applet
metoda
windowClosing
apeleaz stop i
destroy
public class AppletWindowHandler extends WindowAdapter {
JApplet ap;
// Constructor
public AppletWindowHandler ( JApplet a ) { ap = a; }
// Aceasta metoda implementeaza un ascultator care
// detecteaza evenimentul "inchidere fereastra",
// termina ("shut down") applet-ul si opreste programul.
public void windowClosing(WindowEvent e) {
ap.stop();
ap.destroy();
System.exit(0);
};
}
OOP11 - M. Joldo - T.U. Cluj 20
Dualitate Aplicaie / Applet
Ruleaz ca aplicaie Ruleaz ca applet
OOP11 - M. Joldo - T.U. Cluj 21
Convertirea unei aplicaii existente la
applet (ghid generic)
Creai textul HTML care va invoca applet-ul.
Clasa cea mai de sus trebuie s extind JApplet, nu
JFrame. Dai lui JApplet gestionarul BorderLayout pe
care l folosete implicit JFrame.
nlocuii constructorul clasei cu o metod init() pentru a
realiza setrile applet-ului.
Mutai orice instruciuni de iniializare din main() n init().
Alte instruciuni care efectueaz setri de re-vizitare a paginii
trebuie plasate ntr-o metod numit start().
Modificai/nlturai orice poriuni de cod care nu pot s fie
folosite ntr-un applet, cum sunt setarea barei de titlu, apelul
rutinelor n cod nativ, I/E, comenzi pentru SO etc.
Plasai orice cod pentru curare sau oprire n metoda
stop().
OOP11 - M. Joldo - T.U. Cluj 22
Conversia Applet -> Aplicaie
Facei clasa cea mai de sus s extind JFrame i nu
JApplet.
Adugai o rutin main clasei. Trebuie avut grij aici
deoarece rutina main s-ar putea s trebuiasc s
transfere argumente n acelai fel n care au putut fi
transferai parametri la applet via HTML.
Rutina main trebuie s creeze o instan a clasei. n
schimb, constructorul clasei trebuie s apeleze (sau s
conin) metodele start() i init().
Adugai un meniu cu element de ieire/buton de ieire
pentru a asigura mijlocul de ieire din aplicaie.
OOP11 - M. Joldo - T.U. Cluj 23
Folosirea Swing n applet-uri
JApplet este un Container de nivel sus (top level)
Unele browsere de Web nu suport rularea applet-urilor
care au componente Swing
n astfel de cazuri, trebuie instalat Plug-In ul
corespunztor
Applet Viewer suport Swing
import javax.swing.*;
public class TestJApplet extends JApplet
{
public void init()
{
// Get the content pane
Container container = getContentPane();
JButton button = new JButton("Button");
container.add(button); // Add it to the content pane
}
}
OOP11 - M. Joldo - T.U. Cluj 24
JApplet n raport cu Applet
Componentele se adaug la panoul de coninut
(content pane) al applet-ului Swing, nu direct la
applet
Gestionarii de aranjare se seteaz la panoul de
coninut al applet-ului Swing, nu direct la applet
Gestionarul implicit este BorderLayout (nu
FlowLayout ca la applet-urile obinuite)
Suport tehnologiile de asistare (pentru cei cu
handicap)
Suport adugarea barelor de meniu
OOP11 - M. Joldo - T.U. Cluj 25
Limitrile applet-urilor
Applet-urile ruleaz ntr-o cutie cu nisip
Gestionarul securitii protejeaz utilizatorul
Applet-urile NU pot:
Accesa fiiere de pe maina client.
Crea fiiere pe maina client.
Realiza conectri n reea cu excepia celor cu maina de
pe care provin.
Lansa programe pe maina client.
ncrca biblioteci.
Defini apeluri de metode n cod nativ.
Opri execuia interpretorului (nu pot apela
System.exit()).
OOP11 - M. Joldo - T.U. Cluj 26
Limitrile applet-urilor
Nu pot rula nici un executabil client
Nu pot comunica cu nici o alta gazd cu excepia serverului
de unde provin
Nu pot citi sau scrie pe sistemul de fiierul client
Pot obine doar informaie limitat despre maina client:
Versiunea de Java n uz
Numele i versiunea de SO care ruleaz
Caracterele folosite ca separatori de fiier i linie
Limba folosit pe client (d.e. English) & specificul local
(Eastern Europe)
Moneda client ()
Ferestrele afiate (popped up) de un applet au un mesaj de
avertizare
OOP11 - M. Joldo - T.U. Cluj 27
Colecii Java
OOP11 - M. Joldo - T.U. Cluj 28
Limitrile tablourilor
La gestiunea seriilor, seturilor i a grupurilor de date,
tablourile nu sunt ntotdeauna cea mai bun soluie
Tablourile nu exceleaz atunci cnd datele sunt volatile n
special atunci cnd mrimea setului de date poate fluctua
inserarea unui element necesit glisarea elementelor de deasupra
punctului de inserie -> e nevoie de spaiu suplimentar alocat la
sfrit
Mai general, tablourile expun programatorului de aplicaie
problemele legate de gestiunea de nivel jos a memoriei
Dac cineva dorete s ofere accesul la un tablou privat:
poate face accesibil tabloul nsui printr-o metod accesoare
poate furniza o interfa pentru iterare cu metodele: first, next, etc.
poate ntoarce o copie adnc a tabloului lucru foarte ineficient
OOP11 - M. Joldo - T.U. Cluj 29
Colecii versus tablouri
Lucrul cu API Collections este diferit de lucrul cu tablouri
Tablourile sunt cu legare tare la tipuri (strongly typed)
Se specific tipul elementelor i compilatorul impune tipul la
ncercarea de asignare de valori la elemente
Se pot defini tablouri de elemente de tipuri primitive
Coleciile sunt cu legare slab la tipuri (weakly typed)
Exist o clas Vector i toate elementele sale sunt de tipul
Object -> toate obiectele de toate tipurile pot fi stocate acolo i e
nevoie de forarea tipului (downcast) elementelor la citire
Nu se pot include valori primitive n colecii, dei exist o cale de
mpachetare/nvelire (box) a lor clasele nvelitoare (d.e. Integer,
Boolean, Double etc.)
OOP11 - M. Joldo - T.U. Cluj 30
Colecii versus tablouri
Tablourile dau n general vitez mai mare,
deoarece reprezint blocuri de memorie accesibile
direct
Coleciile sunt obiecte cu metode care trebuie
invocate pentru a citi sau scrie elemente
Coleciile ofer cteva avantaje generale:
Sunt mult mai uor de folosit pentru programare de uz
general, n special atunci cnd datele sunt foarte volatile
multe adugri, tergeri i modificri directe n timp
Designul mprit "iterator" ajut la ascunderea
alegerilor fcute la implementare
OOP11 - M. Joldo - T.U. Cluj 31
Colecii
Colecie Java: orice clas care pstreaz obiecte i
implementeaz interfaa Collection
De exemplu, clasa ArrayList<T> este o clas colecie
Java i implementez toate metodele din interfaa
Collection
Coleciile sunt folosite mpreun cu iteratori
Interfaa Collection este cel mai nalt nivel din
cadrul general Java pentru clase colecie
Toate clasele colecie tratate aici se afl n pachetul
java.util
OOP11 - M. Joldo - T.U. Cluj 32
Colecii
API Collection include:
Colecii cum sunt Vector, LinkedList i Stack
Mapri care indexeaz valori pe baza cheilor, cum
este HashMap
Variante care asigur c elementele sunt
ntotdeauna ordonate de un comparator: TreeSet
i TreeMap
Iteratori care abstractizeaz abilitatea de a citi i
scrie coninutul coleciilor n bucle i care izoleaz
acea abilitate de implementarea coleciei care st la
baz
OOP11 - M. Joldo - T.U. Cluj 33
"Peisajul" Collection
OOP11 - M. Joldo - T.U. Cluj 34
"Peisajul" Collection
Coleciile ordonate
implementeaz
List
Coleciile care
asigur unicitatea
elementului
implementeaz Set
Coleciile sortate
implementeaz
SortedSet
OOP11 - M. Joldo - T.U. Cluj 35
Caractere de nume nespecificat
(wildcards)
Clasele i interfeele din cadrul general Collection pot
avea specificri de parametri de tip care nu specific
complet tipul care l va avea parametrul
Pentru c ele specific o gam larg de tipuri de
argumente, ele sunt numite caractere de nume
nespecificat (wildcards )
public void method(String arg1, ArrayList<?> arg2)
n exemplul de mai sus, primul argument este de
tipul String, n timp ce al doilea argument poate fi
un ArrayList<T> cu orice tip de baz
OOP11 - M. Joldo - T.U. Cluj 36
Caractere de nume nespecificat
(wildcards)
Se poate limita efectul unui caracter de nume
nespecificat (wildcard) preciznd c tipul
trebuie s fie un tip strmo sau descendent al
unei clase sau a unei interfee
Notaia <? extends String> specific faptul
c argumentul care va fi folosit trebuie s fie un
obiect din orice clas descendent a lui String
Notaia <? super String> specific faptul c
argumentul care va fi folosit trebuie s fie un
obiect din orice clas strmo al lui String
OOP11 - M. Joldo - T.U. Cluj 37
Cadrul general Collection
Interfaa Collection<T> descrie operaiile de
baz pe care toate clasele colecie trebuie s le
implementeze
Cum o interfa este un tip, orice metod poate
avea parametri de tipul Collection<T>
Parametrul respectiv poate fi nlocuit la apel cu orice
argument care este un obiect de orice clas din cadrul
general colecie
OOP11 - M. Joldo - T.U. Cluj 38
Interfaa Collection
Toate coleciile pot:
aduga / elimina elemente
terge toate elementele coleciei astfel
nct rezult un set vid
raporta mrimea lor
converti datele ntr-un tablou de
Object
interface Collection
{ // lista partiala de metode
public int size();
public void clear();
public Object[] toArray();
public boolean add( Object );
public boolean remove( Object );
public boolean addAll( Collection );
public Iterator iterator()
Se pot defini
proprieti
suplimentare definite
de implementarea
uneia dintre sub-
interfeele
Collection
coleciile ordonate
implementeaz List
coleciile care asigur
unicitatea
elementelor
implementeaz Set
coleciile care
sorteaz
implementeaz
SortedSet
OOP11 - M. Joldo - T.U. Cluj 39
Construirea coleciilor
Coleciile trebuie create explicit
Greeal frecvent: declararea unei referine la un Vector sau la o
LinkedList i presupunerea c obiectul este acolo
O dat creat obiectul colecie, pur i simplu i se adaug
elemente
Folosii add pentru a aduga un nou element la sfrit. Atenie c
valorile primitive trebuie "nvelite" n clase. E.e.
vec.add(new Integer(5))
int i = ((Integer) vec.elementAt(0)).intValue();
Boolean b = ((Boolean)
vec.elementAt(2)).booleanValue();
Folosii metodele de inserare definite de subtipuri ale
Collection
remove (eliminai) un element identificnd-ul. Multe subtipuri
ofer metode de eliminare bazate pe indeci
Se poate pune orice obiect Java n orice colecie
colecii omogene vs eterogene
OOP11 - M. Joldo - T.U. Cluj 40
Capcan: operaii opionale
Atunci cnd o interfa declar o metod ca
"opional," ea trebuie totui implementat
ntr-o clas care implementeaz interfaa
Semnificaia lui "opional" este c se permite s
se scrie o metod care nu implementeaz
complet interfaa
n orice caz, dac se d o implementare trivial
atunci corpul metodei trebuie s arunce o
excepie de tipul
UnsupportedOperationException
OOP11 - M. Joldo - T.U. Cluj 41
Sugestie: Cum s procedm cu acele
excepii
Tabelele de metode pentru diversele interfee i clase
colecie indic faptul c se arunca anumite excepii
Acestea sunt excepii neverificate, aa c sunt utile la depanare,
dar nu e nevoie s fie declarate sau interceptate
ntr-o clas colecie existent, ele pot fi considerate
mesaje de eroare la execuie (run-time error messages)
ntr-o clas derivat dintr-o alt clas colecie, majoritatea
sau toate vor fi motenite
ntr-o clas colecie definit din nimic, dac ea urmeaz s
implementeze o interfaa colecie, atunci ea trebuie s
arunce excepiile care sunt specificate n interfa
OOP11 - M. Joldo - T.U. Cluj 42
Clase colecie concrete
Clasele ArrayList<T> i Vector<T>
implementeaz toate metodele din interfaa List<T>
i pot fi folosite aa cum sunt dac nu e nevoie de
metode suplimentare
Fiecare dintre ele se poate folosi atunci cnd este
nevoie de o List<T> cu acces aleatoriu eficient la
elemente
Clasa concret HashSet<T> implementeaz toate
metodele din interfaa Set<T> i poate fi folosit aa
cum este dac nu e nevoie de metode suplimentare
HashSet<T> adaug doar constructori pe lng
metodele din interfa
HashSet<T> este implementat folosind o tabel de
dispersie
OOP11 - M. Joldo - T.U. Cluj 43
Clasa Vector
Ofer accesul aleatoriu la o list scalar de elemente
Vector i ArrayList au semantica apropiat de un tablou
for (int n = 0; n < vec.size(); n++)
System.out.println((String) vec.elementAt(n));
Elementele sunt n ordinea n care au fost adugate la colecie nu
exist sortare implicit
Elementele nu trebuie s fie unice n colecie
Vectorii se comport cel mai bine la "acces aleator" la
elemente au n spate tablouri
punctul slab ca i la tablouri inserarea i tergerea
Vectorii au capacitate i mrime
size = mrimea; numrul de elemente aflate curent n colecie
capacitate = cte locaii sunt alocate curent pentru elemente;
capacitate size
OOP11 - M. Joldo - T.U. Cluj 44
Clasa ArrayList
Crearea:
new ArrayList()
new ArrayList(int
initialCapacity)
Msurarea:
int size()
Stocarea:
boolean add(Object o)
boolean add(int
index, Object
element)
Object set(int index,
Object element)
Regsirea:
Object get(int index)
Object remove(int
index)
Testarea:
boolean isEmpty()
boolean
contains(Object elem)
Aflarea poziiei (eec = -
1):
int indexOf(Object
elem)
int
lastIndexOf(Object
elem)
OOP11 - M. Joldo - T.U. Cluj 45
Differene ntre ArrayList<T> and
Vector<T>
Pentru majoritatea scopurilor,
ArrayList<T> i Vector<T> sunt
echivalente
Clasa Vector<T> este mai veche i a trebuit s
i se adauge cteva metode pentru a se potrivi n
cadrul general colecie
Clasa ArrayList<T> este mai noua i a fost
creat ca parte a cadrului general colecie Java
Clasa ArrayList<T> se presupune a fi i mai
eficient dect clasa Vector<T>
OOP11 - M. Joldo - T.U. Cluj 46
Exemplu ArrayList
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorReferenceDemo
{
public static void main(String[] args)
{
ArrayList<Date> birthdays = new
ArrayList<Date>( );
birthdays.add(new Date(1, 1, 1990));
birthdays.add(new Date(2, 2, 1990));
birthdays.add(new Date(3, 3, 1990));
System.out.println("Lista contine:");
Iterator<Date> i = birthdays.iterator( );
while (i.hasNext( ))
System.out.println(i.next( ));
i = birthdays.iterator( );
Date d = null; //To keep the compiler happy.
System.out.println("Schimbarea
referintelor.");
while (i.hasNext( ))
{
d = i.next( );
d.setDate(4, 1, 1990);
}
System.out.println("Lista contine
acum:");
i = birthdays.iterator( );
while (i.hasNext( ))
System.out.println(i.next( ));
System.out.println("Pacaleala!");
}
}
OOP11 - M. Joldo - T.U. Cluj 47
Exemplu: Aflarea irurilor duplicat
Remarcai faptul c codul
refer ntotdeauna
Colecia prin tipul
interfetei sale (Set) nu
prin tipul implementarii
(HashSet).
Aceasta este o practic de
programare foarte
recomandat deoarece v
ofer flexibilitatea de a
schimba implementrile
prin simpla schimbare a
constructorului.
import import import import java.util java.util java.util java.util.*; .*; .*; .*;
public public public public class class class class FindDups FindDups FindDups FindDups { { { {
public static public static public static public static void void void void main main main main( (( (String String String String args args args args[]) { []) { []) { []) {
Set< Set< Set< Set<String String String String> s = > s = > s = > s = new new new new HashSet HashSet HashSet HashSet< << <String String String String>(); >(); >(); >();
for ( for ( for ( for (String String String String a : a : a : a : args args args args) ) ) )
if if if if (! (! (! (!s.add s.add s.add s.add(a)) (a)) (a)) (a))
System.out.println System.out.println System.out.println System.out.println("Duplicat: " + a); ("Duplicat: " + a); ("Duplicat: " + a); ("Duplicat: " + a);
System.out.println System.out.println System.out.println System.out.println( (( (s.size s.size s.size s.size()+" cuvinte distincte: "+s); ()+" cuvinte distincte: "+s); ()+" cuvinte distincte: "+s); ()+" cuvinte distincte: "+s);
} } } }
} } } }
java java java java FindDups FindDups FindDups FindDups i came i i came i i came i i came i saw saw saw saw i i i i learned learned learned learned
Duplicat: i Duplicat: i Duplicat: i Duplicat: i
Duplicat: i Duplicat: i Duplicat: i Duplicat: i
4 cuvinte distincte: [i, 4 cuvinte distincte: [i, 4 cuvinte distincte: [i, 4 cuvinte distincte: [i, learned learned learned learned, , , , saw saw saw saw, came] , came] , came] , came]
OOP11 - M. Joldo - T.U. Cluj 48
Exemplu modificat : Aflarea irurilor
duplicat
import import import import java.util java.util java.util java.util.*; .*; .*; .*;
public public public public class class class class FindDups2 { FindDups2 { FindDups2 { FindDups2 {
public static public static public static public static void void void void main main main main( (( (String String String String args args args args[]) { []) { []) { []) {
Set< Set< Set< Set<String String String String> > > > uniques uniques uniques uniques = = = = new new new new HashSet HashSet HashSet HashSet< << <String String String String>(); >(); >(); >();
Set< Set< Set< Set<String String String String> > > > dups dups dups dups = = = = new new new new HashSet HashSet HashSet HashSet< << <String String String String>(); >(); >(); >();
for ( for ( for ( for (String String String String a : a : a : a : args args args args) ) ) )
if if if if (! (! (! (!uniques.add uniques.add uniques.add uniques.add(a)) (a)) (a)) (a)) dups.add dups.add dups.add dups.add(a); (a); (a); (a);
// // // // Diferenta Diferenta Diferenta Diferenta de de de de multimi multimi multimi multimi distructiva distructiva distructiva distructiva
uniques.removeAll uniques.removeAll uniques.removeAll uniques.removeAll( (( (dups dups dups dups); ); ); );
System.out.println System.out.println System.out.println System.out.println("Cuvinte unice: " + ("Cuvinte unice: " + ("Cuvinte unice: " + ("Cuvinte unice: " + uniques uniques uniques uniques); ); ); );
System.out.println System.out.println System.out.println System.out.println("Cuvinte duplicate: " + ("Cuvinte duplicate: " + ("Cuvinte duplicate: " + ("Cuvinte duplicate: " + dups dups dups dups); ); ); );
} } } }
} } } }
java java java java FindDups FindDups FindDups FindDups i came i i came i i came i i came i saw saw saw saw i i i i learned learned learned learned
Cuvinte unice: [left, Cuvinte unice: [left, Cuvinte unice: [left, Cuvinte unice: [left, saw saw saw saw, came] , came] , came] , came]
Cuvinte duplicate: [i] Cuvinte duplicate: [i] Cuvinte duplicate: [i] Cuvinte duplicate: [i]
OOP11 - M. Joldo - T.U. Cluj 49
Clase colecie concrete
Clasa concret LinkedList<T> este derivat din
clasa abstract AbstractSequentialList<T>
Ar trebui folosit atunci cnd este nevoie de traversarea
secvenial eficient a unei liste
Interfaa SortedSet<T> i clasa concret
TreeSet<T> sunt destinate s implementeze
interfaa Set<T> i s ofere regsirea rapid a
elementelor
Implementarea clasei este asemntoare cu un arbore
binar, dar inserarea pstreaz echilibrul arborelui
OOP11 - M. Joldo - T.U. Cluj 50
Clasa LinkedList
Este un alt mijloc de obinere a unei colecii scalare
Fiecare element din lista nlnuit este discret n
memorie
Elementul conine o referin spre elementul urmtor i
alta spre elementul precedent
Listele nlnuite se comport bine la inserri i
tergeri nu este nevoie de glisarea elementelor la
inserare
Se desfac legturile existente i se formeaz altele noi
tergerea implic schimbarea unor legturi
Iterarea este mai lent
Nu se poate cuta aleator, trebuie traversat element cu
element
OOP11 - M. Joldo - T.U. Cluj 51
Capcan: Omiterea lui <T>
Omiterea lui <T> sau a numelui de clas corespunztor
dintr-o referin la o clas colecie este o eroare pentru
care compilatorul poate sau nu s emit un mesaj de
eroare (depinde de ce conine codul) i chiar dac o face,
mesajul de eroare poate fi destul de ciudat
Cutai un <T> sau un <ClassName> lips atunci cnd un
program care folosete clase colecie d un mesaj de
eroare ciudat sau nu se execut corect
OOP11 - M. Joldo - T.U. Cluj 52
O privire asupra cadrului general Map
Cadrul general Java map trateaz colecii de
perechi ordonate
De exemplu, o cheie i valoarea asociat ei
Obiectele din cadrul general map pot implementa
funcii i relaii, astfel nct pot fi folosite la
construirea claselor pentru baze de date
Cadrul general map folosete interfaa Map<T>,
clasa AbstractMap<T> i clase derivate din clasa
AbstractMap<T>
OOP11 - M. Joldo - T.U. Cluj 53
Enumerri i iteratori
Sunt obiecte folosite pentru a parcurge un
container.
Sunt disponibile pentru unele clase container standard
care implementeaz interfeele corespunztoare.
Funcioneaz corect chiar dac containerul se modific.
Ordinea poate sau nu s fie semnificativ.
Java are doua variaiuni:
Enumeration (vechi: de la JDK 1.0)
Iterator (mai nou: de la JDK 1.2)
OOP11 - M. Joldo - T.U. Cluj 54
Enumerri
Pentru a obine un enumerator e pentru containerul v:
Enumeration e = v.elements();
e este iniializat la nceputul listei.
Pentru a obine primul element i urmtoarele:
someObject = e.nextElement()
Pentru a verifica dac le-am parcurs pe toate:
e.hasMoreElements()
Exemplu:
for (Enumeration e = v.elements();
e.hasMoreElements(); ) {
System.out.println(
e.nextElement());
}
OOP11 - M. Joldo - T.U. Cluj 55
Iteratori
Iterator: un obiect folosit la o colecie pentru a
furniza accesul secvenial la elementele coleciei
Acest acces permite examinarea i eventual modificarea
elementelor
Iteratorul impune o ordonare a elementelor
coleciei chiar dac colecia n sine nu impune o
ordine asupra elementelor pe care le conine
n cazul n care colecia impune o ordonare asupra
elementelor sale, iteratorul va folosi aceeai ordonare
OOP11 - M. Joldo - T.U. Cluj 56
Interfaa Iterator<T>
Interfaa Iterator<T> izoleaz folosirea unei
colecii de clasa colecie n sine
O Iterator<T> nu este de sine stttoare
Ea trebuie asociat cu un obiect colecie folosind
metoda iterator. D.e. Dac c este o instan a
unei clase colecie (d.e., HashSet<String>), codul
care urmeaz obine un iterator pentru c:
Iterator iteratorForC = c.iterator();
interface Iterator
{
public boolean hasNext();
public Object next();
public void remove();// optional
}
OOP11 - M. Joldo - T.U. Cluj 57
Folosirea unui iterator cu un obiect
HashSet<T>
Un obiect de tipul HashSet<T> nu impune nici o
ordine asupra elementelor pe care le conine
Cu toate acestea, un iterator va impune o ordine
asupra elementelor din set
Aceasta va fi ordinea n care elementele sunt regsite de
next()
Dei la fiecare rulare a programului ordinea elementelor
produse astfel poate fi identic, nu exist nici o cerin
care s impun acest lucru
OOP11 - M. Joldo - T.U. Cluj 58
Exemplu: iterator peste HashSet<T>
import java.util.HashSet;
import java.util.Iterator;
public class HashSetIteratorDemo
{
public static void main(String[] args)
{
HashSet<String> s = new HashSet<String>( );
s.add("health");
s.add("love");
s.add("money");
System.out.println("The set contains:");
Iterator<String> i = s.iterator( );
while (i.hasNext( )) System.out.println(i.next( ));
i.remove( );
System.out.println( );
System.out.println("The set now contains:");
i = s.iterator( );
while (i.hasNext( )) System.out.println(i.next( ));
System.out.println("End of program.");
}
}
OOP11 - M. Joldo - T.U. Cluj 59
Sugestie: Bucle For-Each ca iteratori
Dei nu este iterator, bucla for-each poate servi n acelai
scop ca un iterator
Bucla for-each se poate folosi pentru a parcurge fiecare element al
unei colecii
Buclele for-each pot fi folosite la oricare colecie
menionat
Buclele for obinuite nu pot parcurge elementele dintr-un
obiect colecie
Spre deosebire de elementele de tablouri, elementele obiectelor
colecie nu sunt n mod normal asociate cu indici
Dei bucla for obinuita nu poate parcurge elementele
unei colecii, bucla for mbuntit poate parcurge
elementele unei colecii
OOP11 - M. Joldo - T.U. Cluj 60
Bucla "for each"
Sintaxa general a instruciunii for-each (pentru
fiecare) folosit la o colecie este
for (TipColectie NumeVariabila :
NumeColectie)
Instructiune
Linia for-each de mai sus trebuie citit ca "pentru
fiecare NumeVariabila din NumeColectie"
execut ceea ce urmeaz.
Remarcai c NumeVariabila trebuie declarat n
interiorul fiecrei bucle, nu nainte
Remarcai, de asemenea, c se folosete simbolul "dou
puncte" (:) dup NumeVariabila
OOP11 - M. Joldo - T.U. Cluj 61
Exemplu de bucl For-Each ca iterator
import java.util.HashSet;
import java.util.Iterator;
public class ForEachDemo {
public static void main(String[] args) {
HashSet<String> s = new HashSet<String>( );
s.add("health");
s.add("love");
s.add("money");
System.out.println("The set contains:");
String last = null;
for (String e : s) {
last = e;
System.out.println(e);
}
s.remove(last);
System.out.println( );
System.out.println("The set now contains:");
for (String e : s) System.out.println(e);
System.out.println("End of program.");
}
}
OOP11 - M. Joldo - T.U. Cluj 62
Folosirea genericelor
Un tip generic se definete n termenii unui alt tip pe care l
colecteaz sau asupra cruia acioneaz n vreun fel,
folosind parantezele unghiulare (<>)
Exemplu: un ArrayList<Point> este un tablou-list de obiecte
Point (din pachetul java.awt )
ArrayList<Point> someList = new ArrayList<Point>();
permite compilatorului s surprind o eroare de genul:
somelist.add(new Dimension(10, 10));
Unui obiect colecie de un anumit tip i se va furniza un iterator
specific tipului respectiv
Iterator<Point> each = someList.iterator();
Atunci nu mai este necesar s se foreze conversia la tipul necesar
pentru rezultatele metodelor accesoare, d.e.
while (each.hasNext())
each.next().x = 11;
OOP11 - M. Joldo - T.U. Cluj 63
Interfaa ListIterator<T>
Interfaa ListIterator<T> extinde interfaa
Iterator<T> i este menit s lucreze cu colecii
care satisfac interfaa List<T>
Un ListIterator<T> are toate metodele pe care le
are un Iterator<T> , plus metode suplimentare
Un ListIterator<T> se poate deplasa n ambele
direcii pe o list de elemente
ListIterator<T> are metode cum sunt set() i
add() care se pot folosi la modificarea elementelor
OOP11 - M. Joldo - T.U. Cluj 64
Cursorul ListIterator<T>
Fiecare ListIterator<T> are un marcator de poziie numit
cursor
Dac lista are n elemente, atunci acestea sunt numerotate prin
indici de la 0 la n-1, dar exist n+1 poziii ale cursorului
La apelul metodei next(), se returneaz elementul care urmeaz
imediat dup cursor, iar cursorul este deplasat nainte cu o poziie
La invocarea metodei previous() se returneaz elementul care
urmeaz imediat naintea cursorului, iar cursorul este deplasat
napoi cu o poziie de cursor
OOP11 - M. Joldo - T.U. Cluj 65
Capcan: next i previous pot
ntoarce o referin
Teoretic, atunci cnd o operaie a iteratorului ntoarce
un element al coleciei, el poate returna o copie sau o
clona a elementului sau poate returna o referin la
element
Iteratorii pentru clasele colecie standard predefinite,
cum sunt ArrayList<T> i HashSet<T>, returneaz
de fapt referine
De aceea, modificarea valorii returnate va face
modificarea elementului din colecie
OOP11 - M. Joldo - T.U. Cluj 66
Sugestie: Definirea Claselor Iterator
proprii
De obicei nu prea este nevoie de clase
Iterator<T> or ListIterator<T> definite de
programator
Cea mai simpl i mai uzitat cale pentru a defini o
clas colecie este s o facem o clas derivat a
uneia dintre clasele colecie de bibliotec
Procednd astfel, metodele iterator() i
listIterator() devin automat disponibile
programului
Dac o clas colecie trebuie definit n vreun alt
mod, atunci clasa iterator ar trebui definit ca
clas intern (clas imbricat) n clasa colecie
OOP11 - M. Joldo - T.U. Cluj 67
Rezumat
Applet
diferene fa de aplicaiile
de sine stttoare
metodele unui applet
parametri
pachete i clase folosite de
applet
aplicaii duale
limitri
Swing n applet
Colecii Java
tablouri vs colecii
API Collections
wildcards, generice
construirea coleciilor
clase colecie concrete:
ArrayList
Vector
LinkedList
HashSet
SortedSet
Iteratori
Bucla for-each

S-ar putea să vă placă și