Membuat array lalu mengisinya satu per satu dengan penugasan terpisah memang sah, tetapi membosankan bila datanya sudah diketahui sejak awal. Java menyediakan array initializer — bentuk ringkas dengan kurung kurawal yang mengisi elemen sekaligus pada saat array dibuat. Pada saat yang sama, kita perlu memahami apa isi array yang baru dibuat dengan new sebelum diisi apa pun, karena nilai defaultnya mengikuti tipe elemen. Chapter ini membahas ketiga bentuk pengisian tersebut beserta aturan nilainya.

Array Initializer dengan Kurung Kurawal #

Bentuk paling ringkas menulis daftar nilai di antara { } langsung pada deklarasi: int[] pendek = {1, 2, 3}. Compiler javac menghitung jumlah nilainya, membuat array dengan ukuran tersebut, lalu menyalin nilai satu per satu ke slot yang sesuai. Karena ukurannya disimpulkan dari isi, bentuk ini tidak bisa dipakai untuk mengubah isi array yang sudah ada — hanya sah pada baris deklarasi.

Catatan untuk pengguna var: bentuk initializer justru tidak bisa dipakai bersama type inference. Penulisan var data = {1, 2, 3}; ditolak compiler dengan pesan cannot infer type for local variable data, karena compiler tidak punya konteks tipe untuk mengartikan kurung kurawal tersebut. Inisialisasi dengan var tetap sah memakai bentuk eksplisit: var data = new int[]{1, 2, 3};.

Bentuk kedua, new int[]{4, 5, 6, 7}, memisahkan kata kunci new dari daftar nilai. Ukurannya tetap dihitung compiler, tetapi bentuk ini boleh dipakai di mana saja sebagai ekspresi — termasuk dikirim langsung sebagai argumen method tanpa variabel perantara.

public class InisialisasiArray {
    public static void main(String[] args) {
        int[] pendek = {1, 2, 3};
        int[] lengkap = new int[]{4, 5, 6, 7};

        System.out.print("pendek  : ");
        for (int n : pendek) {
            System.out.print(n + " ");
        }
        System.out.println();

        System.out.print("lengkap : ");
        for (int n : lengkap) {
            System.out.print(n + " ");
        }
        System.out.println();

        System.out.println("Jumlah array anonim: " + jumlah(new int[]{8, 9, 10}));
    }

    static int jumlah(int[] data) {
        int total = 0;
        for (int n : data) {
            total += n;
        }
        return total;
    }
}

Output yang Dihasilkan:

text
pendek  : 1 2 3 
lengkap : 4 5 6 7 
Jumlah array anonim: 27

Mari kita telaah baris-baris kode di atas:

  1. Baris 3 (int[] pendek = {1, 2, 3};): bentuk short yang hanya sah pada deklarasi. Compiler membuat array berukuran 3 lalu mengisi 1, 2, 3 berurutan — setara dengan pendek[0] = 1; pendek[1] = 2; pendek[2] = 3; namun ditulis satu baris.
  2. Baris 4 (int[] lengkap = new int[]{4, 5, 6, 7};): bentuk eksplisit dengan new. Ukuran tetap disimpulkan dari jumlah elemen di dalam kurung kurawal, yakni 4.
  3. Baris 18 (jumlah(new int[]{8, 9, 10})): array anonim — dibuat, dikirim, lalu tidak lagi dikaitkan ke nama variabel mana pun. Bentuk {8, 9, 10} tanpa new int[] akan ditolak compiler di posisi ini karena di luar deklarasi.
  4. Baris 22-27 (method jumlah): menerima parameter bertipe int[], menjumlahkan seluruh elemen, lalu mengembalikan 27.

Nilai Default Elemen Array #

Apa isi array yang dibuat dengan new int[5] sebelum kita mengisi apa pun? Jawabannya bergantung pada tipe elemennya. JVM selalu mengisi setiap slot saat array dibuat — slot int diisi 0, slot boolean diisi false, dan slot tipe referensi diisi null. Perilaku ini berbeda dengan variabel lokal biasa yang wajib kita isi sendiri sebelum dibaca; elemen array tidak pernah “belum terisi”.

Tipe elemenNilai default
byte, short, int, long0
float, double0.0
booleanfalse
char'\u0000'
tipe referensi (String, class lain)null
public class NilaiDefault {
    public static void main(String[] args) {
        int[] angka = new int[2];
        double[] desimal = new double[2];
        boolean[] kondisi = new boolean[2];
        char[] huruf = new char[2];
        String[] nama = new String[2];

        System.out.println("int[]     : " + angka[0]);
        System.out.println("double[]  : " + desimal[0]);
        System.out.println("boolean[] : " + kondisi[0]);
        System.out.println("char[]    : " + (int) huruf[0]);
        System.out.println("String[]  : " + nama[0]);
    }
}

Output yang Dihasilkan:

text
int[]     : 0
double[]  : 0.0
boolean[] : false
char[]    : 0
String[]  : null

Bedahnya ringkas: kelima array pada baris 3-7 dibuat tanpa inisialisasi isi, sehingga setiap slot memuat nilai default tipe masing-masing. Baris 15 mencetak karakter default dengan cast (int) agar terlihat sebagai angka 0 — karakter '\u0000' memang tak terlihat bila dicetak langsung karena merupakan karakter kosong. Baris 16 menunjukkan slot String[] berisi null, bukan string kosong "" — dua hal tersebut berbeda, dan membaca .length() dari null akan melempar NullPointerException.

Dengan tiga bentuk pengisian ini — default value, initializer { }, dan new T[]{...} — kita siap membahas aspek berikutnya: menyalin array dengan aman tanpa secara tak sengaja membagikan referensi yang sama.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

InisialisasiArray.java

Unduh berkas
java
public class InisialisasiArray {
    public static void main(String[] args) {
        int[] pendek = {1, 2, 3};
        int[] lengkap = new int[]{4, 5, 6, 7};

        System.out.print("pendek  : ");
        for (int n : pendek) {
            System.out.print(n + " ");
        }
        System.out.println();

        System.out.print("lengkap : ");
        for (int n : lengkap) {
            System.out.print(n + " ");
        }
        System.out.println();

        System.out.println("Jumlah array anonim: " + jumlah(new int[]{8, 9, 10}));
    }

    static int jumlah(int[] data) {
        int total = 0;
        for (int n : data) {
            total += n;
        }
        return total;
    }
}

NilaiDefault.java

Unduh berkas
java
public class NilaiDefault {
    public static void main(String[] args) {
        int[] angka = new int[2];
        double[] desimal = new double[2];
        boolean[] kondisi = new boolean[2];
        char[] huruf = new char[2];
        String[] nama = new String[2];

        System.out.println("int[]     : " + angka[0]);
        System.out.println("double[]  : " + desimal[0]);
        System.out.println("boolean[] : " + kondisi[0]);
        System.out.println("char[]    : " + (int) huruf[0]);
        System.out.println("String[]  : " + nama[0]);
    }
}