Qual è l’inizializzazione predefinita di un array in Java?

Quindi sto dichiarando e inizializzando un array int:

static final int UN = 0; int[] arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = UN; } 

Dì che lo faccio invece …

 int[] arr = new int[5]; System.out.println(arr[0]); 

0 stamperà allo standard. Inoltre, se faccio questo:

 static final int UN = 0; int[] arr = new int[5]; System.out.println(arr[0]==UN); 

true stamperà allo standard. Quindi, in che modo Java sta inizializzando il mio array per impostazione predefinita? È sicuro assumere che l’inizializzazione di default sta impostando gli indici dell’array su 0 che significherebbe che non devo scorrere l’array e inizializzarlo?

Grazie.

Tutto in un programma Java non impostato esplicitamente su qualcosa dal programmatore, viene inizializzato su un valore zero.

  • Per riferimenti (tutto ciò che contiene un object) che è null .
  • Per int / short / byte / long che è uno 0 .
  • Per float / double che è uno 0.0
  • Per i booleani è un false .
  • Per char è il carattere null '\u0000' (il cui equivalente decimale è 0).

Quando si crea una matrice di qualcosa, anche tutte le voci vengono azzerate. Quindi il tuo array contiene cinque zeri subito dopo che è stato creato da new .

Nota (basata sui commenti): Java Virtual Machine non è obbligata a azzerare la memoria sottostante durante l’allocazione di variabili locali (ciò consente operazioni di stack efficienti se necessario) in modo da evitare valori casuali che la specifica del linguaggio Java richiede l’inizializzazione delle variabili locali.

Dalla specifica del linguaggio Java :

  • Ogni variabile di class, variabile di istanza o componente di matrice viene inizializzata con un valore predefinito quando viene creata (§15.9, §15.10):

    • Per tipo byte, il valore predefinito è zero, ovvero il valore di (byte)0 .
    • Per tipo short, il valore predefinito è zero, ovvero il valore di (short)0 .
    • Per tipo int, il valore predefinito è zero, ovvero 0 .
    • Per tipo lungo, il valore predefinito è zero, ovvero 0L .
    • Per il tipo float, il valore predefinito è zero positivo, ovvero 0.0f .
    • Per il tipo double, il valore predefinito è zero positivo, ovvero 0.0d .
    • Per tipo char, il valore predefinito è il carattere null, ovvero '\u0000' .
    • Per tipo booleano, il valore predefinito è false .
    • Per tutti i tipi di riferimento (§4.3), il valore predefinito è null .

JLS dice chiaramente

Un inizializzatore di array crea una matrice e fornisce i valori iniziali per tutti i suoi componenti.

e questo indipendentemente dal fatto che la matrice sia una variabile di istanza o una variabile locale o una variabile di class.

Valori predefiniti per i tipi primitivi: doc

Per i valori di default degli oggetti è null .

Thorbjørn Ravn Andersen ha risposto per la maggior parte dei tipi di dati. Poiché c’è stata una discussione accesa sulla matrice,

Citando dal componente jls http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 “il componente dell’array viene inizializzato con un valore predefinito quando viene creato”

Penso che indipendentemente dall’array sia locale o di istanza o variabile di class con valori predefiniti

Secondo java,

Tipo di dati: valori predefiniti

byte – 0

breve – 0

int – 0

lungo – 0L

float – 0.0f

doppio – 0.0d

char – ‘\ u0000’

Stringa (o qualsiasi object) – null

booleano – falso

Java dice che la lunghezza predefinita di un array JAVA al momento dell’inizializzazione sarà 10.

 private static final int DEFAULT_CAPACITY = 10; 

Ma il metodo size() restituisce il numero di elementi inseriti nell’array, e poiché al momento dell’inizializzazione, se non è stato inserito alcun elemento nell’array, restituirà zero.

 private int size; public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1,size - index); elementData[index] = element; size++; } 

Ogni class in Java ha un costruttore (un costruttore è un metodo che viene chiamato quando viene creato un nuovo object, che inizializza i campi delle variabili di class). Pertanto, quando si crea un’istanza della class, viene chiamato il metodo di costruzione durante la creazione dell’object e tutti i valori dei dati vengono inizializzati in quel momento.

Per l’object del tipo di matrice intero, tutti i valori nell’array vengono inizializzati su 0 (zero) nel metodo del costruttore. Allo stesso modo per l’object dell’array booleano, tutti i valori vengono inizializzati su false.

Quindi Java sta inizializzando l’array eseguendo il suo metodo di costruzione durante la creazione dell’object