Tutorial Java 6 – #4 Vectori

In acest topic vom vedea cum definim si cum prelucram structuri de date de tip vector sau matrice in Java.

Un vector reprezinta in Java o forma particulara de obiect ce este utilizat pentru a stoca o lista de elemente omogene (fiecare element din vector are acelasi tip ca si tipul vectorului – tip de baza). Numarul de elemente din vector este fix si defineste lungimea acestuia.

Acest topic face parte dintr-un tutorial Java 6 accesibil prin Tutorial Java 6 – Continut.

Din punct de vedere sintactic si logic, un vector in Java este identic cu un vector in C sau C++. Diferentele sunt la nivel de implementare, insa sunt transparente pentru programator astfel incat sa nu le observam:

  • in Java, vectorii sunt tipuri speciale de obiecte – instante ale clasei array;
  • Java permite utilizarea operatorului [] pentru accesul la elementele vectorului;
  • operatorul new (utilizat pentru a construi obiecte si pentru a aloca spatiu in zona Heap) accepta ca parametru dimensiunea vectorului;
  • deoarece sunt obiecte de tip array, programatorul are acces la atributul length pentru a obtine dimensiunea vectorului (un avantaj major fata de C sau C++ deoarece nu mai trebuie sa gestionezi printr-o alta variabila aceasta valoare);

Cum definim vectori in Java

Sintaxa pentru a defini un vector in Java este

tip_baza[] nume_vector;

tip_baza nume_vector[]; //stil asemanator C/C++

Important ! Prin definire, nume_vector reprezinta o variabila de tip referinta (pointer) neinitializata cu o valoare implicita egala cu null. null reprezinta un cuvant cheie in Java care indica o adresa inexistenta avand valoarea 0.

        //definire vector cu sintaxa recomandata  Java
        int[] intValues;

        //definire vector cu sintaxa asemenatoare C/C++
        long longValues[];

Cum initializam vectori in Java

Deoarece sunt obiecte si valorile din vector sunt stocate in Heap (o zona de memorie din RAM cu alocare dinamica in care programele pot rezerva la run-time spatiu), initializarea unui vector inseamna:

  1. Definire vector
  2. Alocare spatiu
  3. Initializare elemente cu valori (optional, deoarece la alocarea spatiului, elementele primesc valori implicite aferente tipului de baza al vectorului – pentru tipuri primitive vezi, iar pentru referinte valoarea implicita este null)

In acest post sunt analizati vectorii si matricele cu elemente de tip primitiv, iar dupa notiunile legate de clase si obiecte vor fi analizati si vectorii de obiecte.

        //definire vector cu sintaxa recomandata  Java
        int[] intValues;
        //definire vector cu sintaxa asemenatoare C/C++
        long longValues[];

        //alocare spatiu = initializare vector
        intValues = new int[10];     //10 elemente cu valoarea 0
        longValues = new long[5];    //5 elemente cu valoarea 0

Initializarea elementelor se face separat, folosind operatorul []. (ATENTIE ! indexul folosit pentru a accesa elementul ia valori in multimea [0, length-1])

        intValues[0] = 0;   //initializarea primului element
        intValues[1] = 2;   //initializare al 2-lea  element
        intValues[2] = 3;   //initializare al 3-lea  element

Daca consideram ca variabilele de tip vector (referinte sau pointeri) au spatiu rezervat pe stiva functiei main, iar spatiul alocat elementelor vectorului este in HEAP atunci imaginea memorie este:

Vectorul in memorie

Daca se cunosc valorile vectorului, atunci alocarea spatiului si initializarea se poate face printr-o singura instructiune:

tip_baza[] nume_vector = {valoare1, valoare2, …, valoareN);

Un exemplu:

        //definire + alocare spatiu + initializare
        //vector cu 5 elemente de tip char cu valori date
        char[] charValues = {'H','e','l','l','o'};

Cum accesam si prelucram vectori in Java

Accesul la elementele vectorului se face folosind operatorul []. (ATENTIE ! indexul folosit pentru a accesa elementul ia valori in multimea [0, length-1]).

Numarul de elemente dintr-un vector se determina accesand atributul length (in Java, vectorii sunt obiecte de tip array).

        char[] charValues = {'H','e','l','l','o'};

        //determin lungimea vectorului
        int charNumber = charValues.length;

        //modificam valoarea primului element
        charValues[0] = 'h';

De obicei, prelucrarea vectorilor se face prin structuri de control de tip bucla, for sau enhanced for (structurile de control in Java sunt descrise in alt post).

Exemplul urmator initializeaza elementele unui vector cu valori de la 1 la 10.

	int[] intValues = new int[10];

        for(int i=0;i < intValues.length;i++)
            intValues[i] = i+1;

	//enhanced for
        for(int value:intValues)
            System.out.println(value);

ATENTIE ! indexul folosit pentru a accesa elementul ia valori in multimea [0, length-1]. Daca indexul nu este gestionat corect si se depaseste dimensiunea vectorului atunci se obtin erori la executie de tipul ArrayIndexOutOfBoundsException:

  	char[] charValues = {'H','e','l','l','o'};

        //incercare de modificare a elementului al 6-lea
        //exceptie la executie
        charValues[5] = '!';

va genera la executie:

run:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5

Operatii des intalnite de prelucrare a vectorilor in Java:

Alte topicuri care fac parte din acest tutorial Java 6 sunt accesibile prin Tutorial Java 6 – Continut.