Array-uri în Java

Un array păstrează un număr fix de elemente de același tip, accesate prin indice de la 0 la length - 1.

Sintaxă
int[] note = {9, 10, 8};
String[] orase = new String[3];   // 3 elemente null
int[][] matrice = new int[2][3];
note.length
note[0] = 7;

Ce face Array-uri

Un array (tablou) are o lungime fixă, stabilită la creare, și elemente de același tip. Îl creezi cu valori (int[] note = {9, 10, 8};) sau gol, cu o lungime (new int[5]), caz în care elementele primesc valoarea implicită: 0, false sau null.

Elementele se accesează cu indici de la 0 la length - 1. Un indice în afara acestui interval aruncă ArrayIndexOutOfBoundsException. length este un câmp, nu o metodă (fără paranteze), spre deosebire de String.length().

Clasa java.util.Arrays are metode utile: toString pentru afișare, sort, fill, copyOf, equals. Un array afișat direct cu println arată ceva de forma [I@1b6d3586, nu elementele. Dacă ai nevoie de o colecție care crește, folosește ArrayList.

Exemple

Exemplul 1: Creare, acces și parcurgere

Array-ul creat cu new are valorile implicite (null pentru String). Arrays.toString afișează elementele.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] note = {9, 10, 7, 8};
        System.out.println("prima notă: " + note[0] + ", câte: " + note.length);

        int suma = 0;
        for (int i = 0; i < note.length; i++) {
            suma += note[i];
        }
        System.out.println("media: " + (double) suma / note.length);

        String[] orase = new String[3];
        orase[0] = "Iași";
        orase[2] = "Cluj";
        System.out.println(Arrays.toString(orase));

        try {
            System.out.println(note[4]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
    }
}

Rezultat

prima notă: 9, câte: 4
media: 8.5
[Iași, null, Cluj]
Eroare: Index 4 out of bounds for length 4

Exemplul 2: Sortare, copiere și comparare

Arrays.sort modifică array-ul. copyOf creează un array nou (aici mai lung, completat cu 0). == compară referințele, Arrays.equals conținutul.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] preturi = {45, 12, 99, 30};
        Arrays.sort(preturi);
        System.out.println("sortate: " + Arrays.toString(preturi));

        int[] marit = Arrays.copyOf(preturi, 6);
        System.out.println("copie mărită: " + Arrays.toString(marit));

        int[] zero = new int[4];
        Arrays.fill(zero, 7);
        System.out.println("fill: " + Arrays.toString(zero));

        int[] a = {1, 2, 3};
        int[] b = {1, 2, 3};
        System.out.println("a == b: " + (a == b) + ", Arrays.equals: " + Arrays.equals(a, b));
    }
}

Rezultat

sortate: [12, 30, 45, 99]
copie mărită: [12, 30, 45, 99, 0, 0]
fill: [7, 7, 7, 7]
a == b: false, Arrays.equals: true

Exemplul 3: Array bidimensional (matrice)

Un int[][] este un array de array-uri. Aici fiecare rând este un elev, iar fiecare coloană o materie. Arrays.deepToString afișează tot.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] elevi = {"Ana", "Mihai", "Ioana"};
        int[][] note = {
            {9, 10, 8},
            {7, 6, 9},
            {10, 10, 9},
        };
        for (int r = 0; r < note.length; r++) {
            int suma = 0;
            for (int c = 0; c < note[r].length; c++) {
                suma += note[r][c];
            }
            System.out.printf("%-6s media %.2f%n", elevi[r], suma / 3.0);
        }
        System.out.println(Arrays.deepToString(note));
    }
}

Rezultat

Ana    media 9.00
Mihai  media 7.33
Ioana  media 9.67
[[9, 10, 8], [7, 6, 9], [10, 10, 9]]

Greșeli frecvente

  • Bucla până la i <= note.length: ultimul pas iese din array. Condiția corectă este i < note.length.
  • System.out.println(note) afișează tipul și un cod, nu elementele. Folosește Arrays.toString(note).
  • note.length() cu paranteze nu compilează: la array-uri length este câmp.

Comenzi înrudite

  • for: Bucla clasică cu contor: inițializare, condiție verificată înaintea fiecărui pas și actualizare după fiecare pas.
  • Iteratori și for-each: for-each parcurge pe rând elementele unui array sau ale oricărui Iterable; un Iterator permite și ștergerea în timpul parcurgerii.
  • Variabile și tipuri primitive: O variabilă are un tip fix, declarat la creare; Java are 8 tipuri primitive: byte, short, int, long, float, double, char, boolean.
  • Generics (tipuri generice): Generics parametrizează clase și metode cu tipuri (List<String>, Map<String, Integer>), ca erorile de tip să apară la compilare, nu la rulare.