HOWTO · Java

Come inizializzare a zero tutti gli elementi di un array in Java

Scopri quando Java inizializza automaticamente un array a zero e come azzerare un array esistente con diversi metodi.

In questa pagina

Quando si crea un nuovo array Java di un tipo numerico primitivo, i suoi elementi vengono inizializzati a zero: non serve alcun passaggio aggiuntivo. Per azzerare un array già esistente, puoi usare Arrays.fill() oppure assegnare esplicitamente un valore a ogni elemento. Gli array di tipi di riferimento, come Integer[], contengono invece inizialmente valori null.
L’inizializzazione degli array è trattata come parte del percorso sui dati di base nel Tutorial Java.

Azzerare gli elementi di un array con un ciclo for

Un ciclo for assegna un valore a ogni indice di un array esistente. Parte dall’indice 0 e prosegue finché l’indice è minore di numbers.length, così visita tutti gli elementi validi.

Il programma Java completo seguente applica i vari metodi a brevi array e stampa ciascun risultato:

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

public class ArrayInitialization {
  public static void main(String[] args) {
    int[] loopValues = {4, 8, 12};
    for (int i = 0; i < loopValues.length; i++) {
      loopValues[i] = 0;
    }
    System.out.println("for loop: " + Arrays.toString(loopValues));

    int[] filledValues = {4, 8, 12};
    Arrays.fill(filledValues, 0);
    System.out.println("fill: " + Arrays.toString(filledValues));

    List<Integer> repeatedValues = Collections.nCopies(3, 0);
    Integer[] boxedValues = repeatedValues.toArray(new Integer[0]);
    System.out.println("boxed values: " + Arrays.toString(boxedValues));

    int[] numbers = {4, 8, 12};
    int[] oldReference = numbers;
    numbers = new int[numbers.length];
    System.out.println("replacement: " + Arrays.toString(numbers));
    System.out.println("old reference: " + Arrays.toString(oldReference));

    int[] generatedValues = {4, 8, 12};
    Arrays.setAll(generatedValues, index -> 0);
    System.out.println("setAll: " + Arrays.toString(generatedValues));

    int[] newValues = new int[3];
    System.out.println("new array: " + Arrays.toString(newValues));
  }
}

Il programma stampa:

for loop: [0, 0, 0]
fill: [0, 0, 0]
boxed values: [0, 0, 0]
replacement: [0, 0, 0]
old reference: [4, 8, 12]
setAll: [0, 0, 0]
new array: [0, 0, 0]

Azzerare gli elementi di un array con il metodo fill() in Java

Arrays.fill() inserisce il valore indicato in ogni elemento dell’array. Con un array numerico primitivo, Arrays.fill(numbers, 0) azzera l’array esistente sul posto. Il metodo offre anche versioni che riempiono un intervallo selezionato, utili quando vuoi modificare solo una parte dell’array.

Creare valori ripetuti con il metodo nCopies()

Collections.nCopies(length, 0) restituisce una List<Integer> immutabile con valori boxed ripetuti. Convertendo la lista con toArray(new Integer[0]) si ottiene un Integer[]: non un int[] e nemmeno l’azzeramento di un array primitivo esistente. Questo approccio è adatto quando il risultato desiderato è una lista o un array di oggetti boxed, non quando vuoi modificare l’array originale.

Azzerare un array riassegnandolo in Java

L’assegnazione new int[numbers.length] fa sì che numbers punti a un nuovo array, i cui elementi assumono i valori predefiniti. Qualsiasi altra variabile che punta all’array originale continua a vedere i valori che conteneva prima. La riassegnazione sostituisce un riferimento: non svuota il vecchio array per tutte le variabili che lo referenziano.

Azzerare gli elementi di un array con Arrays.setAll()

Arrays.setAll() richiama un generatore basato sull’indice per ogni elemento e memorizza nell’array il valore generato. Nell’esempio, index -> 0 assegna lo stesso valore a ogni indice. Il metodo è utile quando il valore dipende dall’indice; se tutti gli elementi devono ricevere la stessa costante, Arrays.fill() è più diretto.

Conclusione

Un nuovo array numerico primitivo è già inizializzato a zero. Per azzerare un array esistente, Arrays.fill() è una scelta diretta; un ciclo for rende esplicita l’assegnazione elemento per elemento, mentre Arrays.setAll() consente di calcolare valori in base all’indice. Collections.nCopies() crea valori boxed ripetuti in una lista; la riassegnazione crea invece un nuovo array e lascia invariato quello a cui puntano eventuali altri riferimenti.