Fie urmatoarele instructiuni in limbajul Java:
double a, b[], c[][];
String str, tstr[];
a=7.35;
b=new double[4];
c=new double[2][5];
str=new String("Un sir");
tstr=new String[4];
Primele doua din aceste instructiuni sunt declaratii. Se declara ca
a
este o variabila de tip double, b este o referinta
la un tablou unidimensional cu elemente de tip double, c este
o referinta la un tablou bidimensional cu elemente de tip double,
str
este o referinta la un obiect din clasa String (la un sir), iar
tstr este o referinta la un tablou unidimensional, ale
carui componente sunt obiecte din clasa String. Ca efect al executarii
acestei instructiuni, se aloca in memorie spatiu numai pentru valoarea
variabilei a si pentru referintele b, c, str si tstr,
dar nu si pentru obiectele indicate de aceste referinte. In instructiunile
urmatoare, se foloseste operatorul new pentru a aloca in memoria
dinamica spatiu pentru obiectele respective si a atribui ca valori variabilelor
referinta deja declarate anterior referintele catre aceste obiecte.
Dupa cum se stie, este permis sa se combine aceste instructiuni, ca
in exemplul urmator:
double a=7.35, b[]=new double[4], c[][]=new
double[2][5];
String str=new String("Un sir"), tstr[]=new
String[4];
Remarcam, totusi, ca s-a mentinut si aici distinctia dintre declararea
variabilei referinta la tablou si alocarea de memorie prin operatorul
new.
Dimensiunile efective ale tabloului nu se dau la declararea acestuia, ci
la alocarea in memorie.
La crearea tablourilor prin operatorul new, componentele tabloului se
initializeaza la valori nule. Este permisa si in Java initializarea tablourilor
in cadrul declaratiilor de tip, ca in exemplul urmator:
int t[]={12,-3, 5}, w[][]={{2, 4},{1, -3},{-8,
5}};
String s[]={"un sir", "alt sir"};
Remarcam, totusi, ca si in acest caz in partea declarativa propriu-zisa
nu se indica dimensiunile tabloului, acestea rezultand implicit din expresia
de initializare pusa intre acolade. Tot odata, remarcam ca si in acest
caz tablourile sunt plasate tot in memoria dinamica, la fel ca atunci cand
ar fi fost create prin operatorul new.
In limbajele C si C++ sunt posibile declaratii de forma
double a[3], b[2][7]; In acest caz, alocarea de spatiu pentru tablouri nu se face in memoria dinamica, ci in cea statica sau pe stiva. Declaratii de tablou similare se pot face si in alte limbaje de programare, dar nu in Java. |
Componentele tabloului sunt tratate in program ca niste variabile simple, daca apartin unui tip primitiv, sau ca variabile-referinta, cand componentele sunt instante ale unei clase. Adresa sau referinta componentei unui tabou, se poate afla cunoscand adresa de baza a tabloului sau referinta la acesta si indicii componentei respective. In consecinta, accesul la oricare componenta a tabloului este direct, adica putem obtine orice componenta a tabloului fara a parcurge in prealabil alte componente, cu conditia sa ii cunoastem indicele (indicii).
Atribuirea de valoare unei componente se face, deci, printr-o
instructiune de forma
referinta_la_componenta = expresie;
in care referinta la componenta este numele referintei la tablou, insotita
de indicii componentei, de exemplu t[2] sau w[i][j].
Se observa ca numarul de operatii elementare care se fac in aceasta operatie
nu depinde de numarul de componente din tablou, deci operatia are complexitatea
O(1).
Preluarea valorii unei componente de tablou se face, de asemenea folosind intr-o expresie referinta la acea componenta si are, de asemenea, complexitatea O(1).