Fie urmatoarele instrucțiuni în 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 două din aceste instrucțiuni sunt declarații. Se declară că a
este o variabilă de tip double, b este o referință
la un tablou unidimensional cu elemente de tip double, c este o referință
la un tablou bidimensional cu elemente de tip double, str este
o referință la un obiect din clasa String (la un șir), iar tstr
este o referință la un tablou unidimensional, ale cărui
componente sunt obiecte din clasa String. Ca efect al executării
primelor trei instrucțiuni, se alocă în memorie spațiu numai pentru valoarea
variabilei a si pentru referințele b, c, str si tstr,
dar nu și pentru obiectele indicate de aceste referinte. În
instrucțiunile următoare, se folosește operatorul new pentru a
aloca în memoria dinamica spațiu pentru obiectele respective și a
atribui ca valori variabilelor referință, deja declarate anterior,
referințele către aceste obiecte.
După cum se știe, este permis să se combine aceste instrucțiuni, ca
în exemplul următor:
double a=7.35, b[]=new double[4], c[][]=new double[2][5];
String str=new String("Un sir"), tstr[]=new String[4];
Remărcam, totuși, că s-a menținut și aici distincția dintre declararea
variabilei referință la tablou și alocarea de memorie prin
operatorul new. Dimensiunile efective ale tabloului nu se dau
la declararea acestuia, ci la alocarea de memorie.
La crearea tablourilor prin operatorul new, componentele tabloului
se inițializează la valori nule. Este permisă și în Java, la fel ca în
C/C++, inițializarea tablourilor în cadrul declarațiilor de tip, ca în
exemplul următor:
int t[]={12,-3, 5}, w[][]={{2, 4},{1, -3},{-8, 5}};
String s[]={"un sir", "alt sir"};
Remarcăm, totuși, că și în acest caz în partea declarativă propriu-zisă
nu se indică dimensiunile tabloului, acestea rezultând implicit din
expresia de inițializare pusă între acolade. Tot odată, remarcăm că și
în acest caz tablourile sunt plasate tot în memoria dinamică, la fel ca
atunci când ar fi fost create prin operatorul new.
In limbajele C si C++ sunt posibile declarații de forma double a[3], b[2][7]; In acest caz, alocarea de spațiu pentru tablouri nu se face în memoria dinamică, ci în cea statică sau pe stivă. Declarații de tablou similare se pot face și în alte limbaje de programare, dar nu în Java. |
Componentele tabloului sunt tratate în program ca niște variabile simple, dacă aparțin unui tip primitiv, sau ca variabile-referință, când componentele sunt instanțe ale unei clase. Adresa sau referința componentei unui tabou, se poate afla cunoscând adresa de bază a tabloului sau referința la acesta și indicii componentei respective. In consecință, accesul la oricare componentă a tabloului este direct, adică putem obține orice componentă a tabloului fără a parcurge în prealabil alte componente, cu condiția sa îi cunoastem indicele (indicii).
Atribuirea de valoare unei componente se face, deci, printr-o
instrucțiune de forma
referinta_la_componenta = expresie;
în care referința la componentă este numele referinței la tablou,
însoțit de indicii componentei, de exemplu t[2] sau w[i][j].
Se observă ca numărul de operații elementare care se fac în această
operație nu depinde de numărul de componente din tablou, deci operația
are complexitatea O(1).
Preluarea valorii unei componente de tablou se face, de asemenea folosind într-o expresie referința la acea componenta și are tot complexitatea O(1).