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


144

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;
}

Dimmi che lo faccio invece ...

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

... 0verrà stampato allo standard. Inoltre, se lo faccio:

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

... trueverrà stampato allo standard. In che modo Java sta inizializzando il mio array per impostazione predefinita? È sicuro supporre che l'inizializzazione predefinita stia impostando gli indici dell'array su0 ciò significherebbe che non devo eseguire il loop attraverso l'array e inizializzarlo?

Grazie.


Risposte:


281

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 oggetto) che è null.
  • Per int / short / byte / long questo è a 0.
  • Per float / double questo è a 0.0
  • Per i booleani questo è un false.
  • Per char che è il carattere null '\u0000'(il cui equivalente decimale è 0).

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

Nota (basata sui commenti): Java Virtual Machine non è tenuto a azzerare la memoria sottostante durante l'allocazione delle variabili locali (ciò consente operazioni dello stack efficienti se necessario), quindi per evitare valori casuali la specifica del linguaggio Java richiede l'inizializzazione delle variabili locali.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Brad Larson

Tutto tranne le variabili locali, che non sono inizializzate su nulla, come ti dirà il compilatore.
Marchese di Lorne,

@ user207421 come indicato alla fine della risposta.
Thorbjørn Ravn Andersen,

Ciò significa che la prima frase della tua risposta non è corretta e deve essere modificata. E la tua domanda "come fai a saperlo" nella chat non ha senso. Lo dice il JLS, tutto qui, e il compilatore lo impone, idem.
Marchese di Lorne,

@ user207421 "non impostato esplicitamente su qualcosa dal programmatore" (che potrebbe essere richiesto dal compilatore).
Thorbjørn Ravn Andersen,

60

Dalle specifiche del linguaggio Java :

  • Ogni variabile di classe, variabile di istanza o componente dell'array 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 breve, il valore predefinito è zero, ovvero il valore di (short)0.
    • Per tipo int, il valore predefinito è zero, ovvero 0.
    • Per tipo long, il valore predefinito è zero, ovvero 0L.
    • Per il tipo float, il valore predefinito è zero positivo, ovvero 0.0f.
    • Per il tipo doppio, il valore predefinito è zero positivo, ovvero 0.0d .
    • Per il tipo char, il valore di default è il carattere nullo, cioè '\u0000'.
    • Per il tipo booleano, il valore predefinito è false.
    • Per tutti i tipi di riferimento (§4.3), il valore predefinito è null.

2
E che dire di Array of Long se Integer s?
Georgy Dobrev,

1
@GeorgyDobrev. Questi sono tipi di riferimento. Sarebbero nulli secondo le specifiche sopra.
Dave Costa,

Che dire di un array di stringhe?
Zac,

1
@Zac come sopra, una stringa è un oggetto, quindi il valore predefinito nella matrice sarebbe null.
Dave Costa,

18

JLS dice chiaramente

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

e questo indipendentemente dal fatto che l'array sia una variabile di istanza o una variabile locale o una variabile di classe.

Valori predefiniti per tipi primitivi: docs

Per gli oggetti i valori predefiniti sono null.


1
Non risponde alla domanda Sta chiedendo l'inizializzazione predefinita.
Marchese di Lorne,

3

Secondo java,

Tipo di dati: valori predefiniti

byte - 0

breve - 0

int - 0

lungo - 0L

float - 0.0f

doppio - 0.0d

char - '\ u0000'

String (o qualsiasi oggetto) - null

booleano: falso


2
Non sta chiedendo dei campi, sta chiedendo dei componenti dell'array.
Marchese di Lorne,

3
@EJP puoi per favore elaborare cosa significa media del componente array ???? generalmente l'array ha un tipo di dati (stesso tipo) che è inizializzato come sopra, quindi puoi dirmi, media del componente ???
Abhishek Singh,

3

Thorbjørn Ravn Andersen ha risposto per la maggior parte dei tipi di dati. Dal momento che c'era una discussione accesa su array,

Citando dalla specifica jls http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "il componente array viene inizializzato con un valore predefinito quando viene creato"

Penso che indipendentemente dal fatto che l'array sia locale, istanza o variabile di classe, lo farà con i valori predefiniti


2

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

Per oggetto di tipo array intero, tutti i valori dell'array sono inizializzati su 0 (zero) nel metodo del costruttore. Analogamente per l'oggetto dell'array booleano, tutti i valori sono inizializzati su false.

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


1

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

private static final int DEFAULT_CAPACITY = 10;

Ma il size()metodo 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++;
}

2
Sembra ArrayList, non un array.
Thorbjørn Ravn Andersen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.