Collection.toArray în Java

Colecții și iteratori (Collection, Iterable, Iterator) Java 1.2 (varianta cu IntFunction: Java 11)

Copiază elementele unei liste, mulțimi sau cozi într-un array nou, de tip Object[] sau de tipul ales (String[], Integer[]).

Sintaxă
Object[] toArray()
<T> T[] toArray(T[] a)
default <T> T[] toArray(IntFunction<T[]> generator)

Ce face Collection.toArray

toArray() fără argumente returnează un Object[]. De cele mai multe ori vrei un array cu tipul corect, de exemplu String[]; pentru asta scrie lista.toArray(new String[0]) sau, din Java 11, lista.toArray(String[]::new). Java creează un array de mărimea potrivită.

Array-ul este o copie: dacă îl modifici, lista nu se schimbă, și invers. Ordinea elementelor este cea în care le dă colecția: ordinea pozițiilor la List, ordinea sortată la TreeSet.

Metoda există pe orice Collection, deci și pe List și Set. Rezultatul este un array de obiecte (Integer[], nu int[]); pentru int[] folosește lista.stream().mapToInt(Integer::intValue).toArray().

Parametri

Parametru Descriere
a Un array de tipul dorit. Dacă e prea mic (de obicei new T[0]), se creează unul nou de aceeași clasă.
generator O funcție care creează array-ul, de obicei String[]::new.

Ce returnează

Un array nou cu elementele colecției.

Exemple

Exemplul 1: Din listă în String[]

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> orase = List.of("Iași", "Cluj", "Arad");
        String[] a = orase.toArray(new String[0]);
        String[] b = orase.toArray(String[]::new);
        Object[] c = orase.toArray();

        System.out.println(Arrays.toString(a) + " lungime " + a.length);
        System.out.println(Arrays.toString(b));
        System.out.println(c.getClass().getSimpleName() + " " + Arrays.toString(c));
    }
}

Rezultat

[Iași, Cluj, Arad] lungime 3
[Iași, Cluj, Arad]
Object[] [Iași, Cluj, Arad]

Exemplul 2: Dintr-o mulțime sortată, apoi spre int[]

TreeSet dă elementele în ordine crescătoare, deci și array-ul este sortat. Pentru un array de primitive, treci prin stream.

import java.util.Arrays;
import java.util.List;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        TreeSet<Integer> note = new TreeSet<>(List.of(9, 6, 10, 6, 8));
        Integer[] obiecte = note.toArray(Integer[]::new);
        int[] primitive = note.stream().mapToInt(Integer::intValue).toArray();
        System.out.println(Arrays.toString(obiecte));
        System.out.println(Arrays.toString(primitive));
    }
}

Rezultat

[6, 8, 9, 10]
[6, 8, 9, 10]

Exemplul 3: Array-ul este o copie

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> nume = new ArrayList<>(List.of("Ana", "Radu"));
        String[] copie = nume.toArray(String[]::new);
        copie[0] = "Elena";
        nume.add("Ioana");
        System.out.println("Array: " + Arrays.toString(copie));
        System.out.println("Listă: " + nume);
    }
}

Rezultat

Array: [Elena, Radu]
Listă: [Ana, Radu, Ioana]

Greșeli frecvente

  • Faci cast: (String[]) lista.toArray(). Array-ul returnat este Object[], iar cast-ul aruncă ClassCastException. Folosește toArray(new String[0]).
  • Aștepți un int[] din List<Integer>. toArray dă Integer[]; pentru primitive folosește mapToInt(...).toArray().

Comenzi înrudite

  • Arrays.asList: Returnează o listă de mărime fixă legată de un array: poți citi și schimba elemente cu set, dar nu poți adăuga sau șterge.
  • Arrays.toString: toString transformă un array în text de forma [1, 2, 3]; deepToString face același lucru pentru matrice (array-uri de array-uri).
  • List: Interfața pentru liste ordonate: elementele au poziții (0, 1, 2…), se pot repeta și se pot citi după index.
  • Set: Interfața pentru mulțimi: colecții fără duplicate, în care întrebi rapid dacă un element există.
  • Collection.stream: Creează un Stream peste elementele colecției, ca să le filtrezi, transformi, sortezi sau aduni într-un rezultat.