Jaka jest domyślna inicjalizacja tablicy w Javie?

144

Więc deklaruję i inicjalizuję tablicę int:

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

Powiedz, że zrobię to zamiast tego ...

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

... 0wydrukuje do standardu. Jeśli to zrobię:

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

... truewydrukuje do standardu. Jak więc Java domyślnie inicjuje moją tablicę? Czy można bezpiecznie założyć, że domyślna inicjalizacja polega na ustawianiu indeksów tablicy, 0co oznaczałoby, że nie muszę przechodzić przez pętlę i inicjować jej?

Dzięki.

Hristo
źródło
6
Po prostu przeczytaj dokumentację;) docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5
Benj

Odpowiedzi:

281

Wszystko w programie Java, które nie zostało wyraźnie ustawione na coś przez programistę, jest inicjowane do wartości zerowej.

  • To jest dla odniesień (wszystkiego, co zawiera obiekt) null.
  • Dla int / short / byte / long to jest 0.
  • Dla float / double to jest 0.0
  • W przypadku wartości logicznych jest to plik false.
  • Dla znaku jest to znak null '\u0000'(którego odpowiednikiem dziesiętnym jest 0).

Kiedy tworzysz tablicę czegoś, wszystkie wpisy również są zerowane. Więc twoja tablica zawiera pięć zer zaraz po jej utworzeniu przeznew .

Uwaga (na podstawie komentarzy): Wirtualna maszyna Java nie musi zerować pamięci bazowej podczas przydzielania zmiennych lokalnych (w razie potrzeby umożliwia to wydajne operacje na stosie), aby uniknąć wartości losowych, specyfikacja języka Java wymaga zainicjowania zmiennych lokalnych.

Thorbjørn Ravn Andersen
źródło
Komentarze nie służą do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Brad Larson
Wszystko oprócz zmiennych lokalnych, które nie są do niczego zainicjowane, jak powie kompilator.
Markiz Lorne
@ user207421, jak wspomniano na końcu odpowiedzi.
Thorbjørn Ravn Andersen
Co oznacza, że ​​pierwsze zdanie Twojej odpowiedzi jest nieprawidłowe i powinno zostać poprawione. Twoje pytanie na czacie „skąd wiesz” jest bez znaczenia. JLS tak mówi, to wszystko, a kompilator narzuca to, jw.
Markiz Lorne
@ user207421 "nie jest jawnie ustawiony na coś przez programistę" (co może być wymagane przez kompilator).
Thorbjørn Ravn Andersen
60

Ze specyfikacji języka Java :

  • Każda zmienna klasy, zmienna instancji lub składnik tablicy jest inicjowana wartością domyślną podczas tworzenia (§15.9, §15.10):

    • W przypadku bajtu typu wartość domyślna to zero, czyli wartość (byte)0.
    • W przypadku typu short wartością domyślną jest zero, czyli wartość (short)0.
    • Dla typu int wartością domyślną jest zero, czyli 0.
    • W przypadku typu long wartością domyślną jest zero, czyli 0L.
    • W przypadku typu float wartością domyślną jest dodatnie zero, czyli 0.0f.
    • W przypadku typu double wartością domyślną jest dodatnie zero, czyli 0.0d.
    • W przypadku typu char wartością domyślną jest znak null, czyli '\u0000'.
    • Dla typu boolean wartością domyślną jest false.
    • Dla wszystkich typów odwołań (§4.3) wartością domyślną jest null.
Dave Costa
źródło
2
A co z tablicą długich i całkowitych?
Georgy Dobrev
1
@GeorgyDobrev. To są typy referencyjne. Zgodnie z powyższą specyfikacją byłyby zerowe.
Dave Costa,
A co z tablicą String?
Zac
1
@Zac Tak samo jak powyżej, String jest obiektem, więc domyślną wartością w tablicy będzie null.
Dave Costa
18

JLS wyraźnie mówi

Inicjator tablicy tworzy tablicę i dostarcza wartości początkowe dla wszystkich jej składników.

i jest to niezależne od tego, czy tablica jest zmienną instancji, czy zmienną lokalną lub zmienną klasy.

Wartości domyślne dla typów pierwotnych: dokumentacja

W przypadku obiektów wartości domyślne to null.

Aniket Thakur
źródło
1
Nie odpowiada na pytanie. Pyta o domyślną inicjalizację.
Markiz Lorne
3

Według Javy

Typ danych - wartości domyślne

bajt - 0

krótki - 0

int - 0

długi - 0L

float - 0,0f

podwójne - 0,0d

znak - „\ u0000”

Ciąg (lub dowolny obiekt) - null

boolean - false

Abhishek Singh
źródło
2
Nie pyta o pola, pyta o składniki tablic.
Markiz Lorne,
3
@EJP Czy możesz wyjaśnić, co oznacza składnik tablicy ???? ogólnie tablica ma jakiś typ danych (ten sam typ), który jest inicjalizowany jak powyżej, więc czy możesz mi powiedzieć, średnia składowa ???
Abhishek Singh
3

Thorbjørn Ravn Andersen odpowiedział w przypadku większości typów danych. Ponieważ toczyła się gorąca dyskusja na temat tablicy,

Cytowanie ze specyfikacji jls http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 „składnik tablicy jest inicjowany z wartością domyślną podczas tworzenia”

Myślę, że niezależnie od tego, czy tablica jest lokalna, czy zmienna instancji lub klasy, będzie miała wartości domyślne

nantitv
źródło
2

Każda klasa w Javie ma konstruktor (konstruktor to metoda wywoływana podczas tworzenia nowego obiektu, która inicjalizuje pola zmiennych klasy). Dlatego podczas tworzenia instancji klasy wywoływana jest metoda konstruktora podczas tworzenia obiektu, a wszystkie wartości danych są inicjowane w tym czasie.

Dla obiektu typu tablica integer wszystkie wartości w tablicy są inicjalizowane na 0 (zero) w metodzie konstruktora. Podobnie dla obiektu tablicy boolowskiej, wszystkie wartości są inicjalizowane na false.

Tak więc Java inicjuje tablicę, uruchamiając jej metodę konstruktora podczas tworzenia obiektu

kkk
źródło
1

Java twierdzi, że domyślna długość tablicy JAVA w momencie inicjalizacji będzie wynosić 10.

private static final int DEFAULT_CAPACITY = 10;

Ale size()metoda zwraca liczbę wstawionych elementów do tablicy, a ponieważ w momencie inicjalizacji, jeśli nie wstawiłeś żadnego elementu do tablicy, zwróci 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++;
}
RAJIV GUPTA
źródło
2
To wygląda jak ArrayList, a nie tablica.
Thorbjørn Ravn Andersen