Apa inisialisasi default array di Java?

144

Jadi saya mendeklarasikan dan menginisialisasi array int:

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

Katakan saya melakukan ini sebagai gantinya ...

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

... 0akan mencetak ke standar keluar. Juga, jika saya melakukan ini:

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

... trueakan mencetak ke standar keluar. Jadi bagaimana Java menginisialisasi array saya secara default? Apakah aman untuk berasumsi bahwa inisialisasi default adalah pengaturan indeks array 0yang berarti saya tidak perlu mengulang array dan menginisialisasi itu?

Terima kasih.

Hristo
sumber

Jawaban:

281

Segala sesuatu dalam program Java tidak secara eksplisit diatur ke sesuatu oleh programmer, diinisialisasi ke nilai nol.

  • Untuk referensi (apa pun yang memegang objek) itu null.
  • Untuk int / short / byte / long yaitu a 0.
  • Untuk float / double yaitu a 0.0
  • Untuk booleans itu adalah a false.
  • Untuk karakter char adalah karakter nol '\u0000'(yang desimal ekivalennya adalah 0).

Saat Anda membuat larik sesuatu, semua entri juga menjadi nol. Jadi array Anda mengandung lima nol tepat setelah dibuat olehnew .

Catatan (berdasarkan komentar): Java Virtual Machine tidak diharuskan untuk menghilangkan memori yang mendasari saat mengalokasikan variabel lokal (ini memungkinkan operasi stack yang efisien jika diperlukan) sehingga untuk menghindari nilai acak, Spesifikasi Bahasa Jawa memerlukan variabel lokal untuk diinisialisasi.

Thorbjørn Ravn Andersen
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Brad Larson
Semuanya kecuali variabel lokal, yang tidak diinisialisasi ke apa pun, seperti yang akan disampaikan kompiler kepada Anda.
Marquis of Lorne
@ user207421 sebagaimana disebutkan di akhir jawaban.
Thorbjørn Ravn Andersen
Yang berarti kalimat pertama dari jawaban Anda tidak benar dan harus diubah. Dan pertanyaan 'bagaimana Anda tahu' dalam obrolan tidak ada artinya. JLS berkata begitu, itu dia, dan kompiler memaksanya, lagi.
Marquis of Lorne
@ user207421 "tidak diatur secara eksplisit ke sesuatu oleh programmer" (yang mungkin diperlukan oleh kompiler).
Thorbjørn Ravn Andersen
60

Dari Spesifikasi Bahasa Jawa :

  • Setiap variabel kelas, variabel instan, atau komponen array diinisialisasi dengan nilai default ketika dibuat (§15.9, §15.10):

    • Untuk tipe byte, nilai default adalah nol, yaitu nilai (byte)0.
    • Untuk jenis pendek, nilai default adalah nol, yaitu nilai (short)0.
    • Untuk tipe int, nilai defaultnya adalah nol, yaitu 0,.
    • Untuk tipe long, nilai default adalah nol, yaitu 0L,.
    • Untuk tipe float, nilai defaultnya adalah nol positif, yaitu 0.0f,.
    • Untuk tipe ganda, nilai defaultnya adalah nol positif, yaitu 0.0d,.
    • Untuk tipe char, nilai default adalah karakter nol, yaitu '\u0000',.
    • Untuk tipe boolean, nilai standarnya adalah false.
    • Untuk semua jenis referensi (§4.3), nilai standarnya adalah null.
Dave Costa
sumber
2
Dan bagaimana dengan Array Long dan Integer?
Georgy Dobrev
1
@GeorgyDobrev. Itu adalah tipe referensi. Mereka akan menjadi nol sesuai dengan spesifikasi di atas.
Dave Costa
Bagaimana dengan array String?
Zac
1
@ Zac sama seperti di atas, String adalah objek, jadi nilai default dalam array akan menjadi null.
Dave Costa
18

JLS dengan jelas mengatakan

Penginisialisasi array membuat array dan memberikan nilai awal untuk semua komponennya.

dan ini terlepas dari apakah array adalah variabel instan atau variabel lokal atau variabel kelas.

Nilai default untuk tipe primitif: docs

Untuk objek nilai defaultnya adalah null.

Aniket Thakur
sumber
1
Tidak menjawab pertanyaan. Dia bertanya tentang inisialisasi default.
Marquis of Lorne
3

Menurut java,

Tipe Data - Nilai default

byte - 0

pendek - 0

int - 0

panjang - 0L

float - 0.0f

dobel - 0,0d

char - '\ u0000'

String (atau objek apa pun) - null

boolean - false

Abhishek Singh
sumber
2
Dia tidak bertanya tentang bidang, dia bertanya tentang komponen array.
Marquis of Lorne
3
@ EJP dapatkah Anda menjelaskan apa yang dimaksud dengan komponen array ???? umumnya array memiliki beberapa tipe data (tipe yang sama) yang diinisialisasi seperti di atas jadi bisakah Anda tolong katakan padaku, berarti komponen ???
Abhishek Singh
3

Thorbjørn Ravn Andersen menjawab untuk sebagian besar tipe data. Karena ada diskusi panas tentang array,

Mengutip dari jls spec http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "komponen array diinisialisasi dengan nilai default ketika dibuat"

Saya pikir terlepas dari apakah array lokal atau instance atau variabel kelas akan dengan nilai default

nantitv
sumber
2

Setiap kelas di Jawa memiliki konstruktor (konstruktor adalah metode yang dipanggil ketika objek baru dibuat, yang menginisialisasi bidang variabel kelas). Jadi ketika Anda membuat turunan kelas, metode konstruktor dipanggil saat membuat objek dan semua nilai data diinisialisasi pada waktu itu.

Untuk objek tipe array integer, semua nilai dalam array diinisialisasi ke 0 (nol) dalam metode konstruktor. Demikian pula untuk objek array boolean, semua nilai diinisialisasi ke false.

Jadi Java menginisialisasi array dengan menjalankan metode konstruktornya saat membuat objek

kkk
sumber
1

Java mengatakan bahwa panjang default dari array JAVA pada saat inisialisasi adalah 10.

private static final int DEFAULT_CAPACITY = 10;

Tetapi size()metode mengembalikan jumlah elemen yang dimasukkan dalam array, dan karena pada saat inisialisasi, jika Anda belum memasukkan elemen apa pun dalam array, itu akan mengembalikan nol.

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
sumber
2
Ini terlihat seperti ArrayList, bukan array.
Thorbjørn Ravn Andersen