Array

Membuat array 1D, 2D, dan jagged, membaca length, serta memahami nilai default tiap elemen.

Daftar isi

Satu variabel menyimpan satu nilai, sedangkan kebutuhan nyata sering berupa sekumpulan data sejenis, misalnya nilai ujian satu kelas atau daftar nama peserta piket. Array menjawab kebutuhan itu dengan satu wadah berukuran tetap yang menampung banyak nilai bertipe sama. Topik ini membahas cara membuat array satu dimensi (1D), dua dimensi (2D), dan jagged, yaitu array dua dimensi yang panjang barisnya tidak seragam. Pembahasan juga mencakup atribut length, nilai default yang mengisi elemen yang belum diisi, serta cara melintasi seluruh elemen dengan perulangan.

Membuat array satu dimensi#

Array satu dimensi adalah deretan elemen bertipe sama yang ditempatkan berurutan di memori. Setiap elemen diakses lewat indeks yang dimulai dari 0, sehingga array berisi lima elemen memiliki indeks 0 sampai 4. Ukuran array tidak dapat berubah setelah dibuat, karena itu ukurannya ditentukan sejak pembuatan.

java Contoh: dua cara membuat array
// tidak-dijalankan
int[] nilai = new int[5];              // lima elemen, sementara berisi nilai default
int[] nilaiUjian = {80, 75, 90, 60};   // ukuran mengikuti jumlah isinya

Bentuk pertama memesan lima slot bertipe int lewat new, dan seluruh slotnya langsung terisi nilai default sebelum satu pun nilai diberikan. Bentuk kedua mengisi array langsung dengan daftar nilai di dalam kurung kurawal, sehingga ukurannya otomatis sama dengan jumlah isi, yaitu empat. Perhatikan bahwa tanda kurung siku boleh ditulis pada tipe (int[] nilai) atau pada nama variabel (int nilai[]), tetapi gaya pertama yang lazim dipakai karena tipe array terbaca utuh sebagai int[].

java DemoArray.java
public class DemoArray {
    public static void main(String[] args) {
        int[] nilai = {80, 75, 90, 60, 85};

        for (int i = 0; i < nilai.length; i++) {
            System.out.println("nilai[" + i + "] = " + nilai[i]);
        }

        int total = 0;
        for (int n : nilai) {
            total += n;
        }
        System.out.println("total = " + total);
        System.out.println("rata-rata = " + (total / (double) nilai.length));
    }
}
text Keluaran
nilai[0] = 80
nilai[1] = 75
nilai[2] = 90
nilai[3] = 60
nilai[4] = 85
total = 390
rata-rata = 78.0

Program di atas memakai dua pola pelintasan. Perulangan for klasik mengakses elemen lewat indeksnya sehingga nomor indeks ikut tercetak, sedangkan perulangan for-each cukup mengambil setiap nilai tanpa peduli posisinya. Jumlah elemen dibaca dari nilai.length, dan hasil pembagian total diubah menjadi double terlebih dahulu agar rata-rata tidak terpotong menjadi bilangan bulat.

Nilai default tiap elemen#

Array yang dibuat dengan new langsung terisi nilai default, sehingga tidak ada elemen yang menyimpan sisa memori tak dikenal. Nilai default-nya bergantung pada tipe elemen array, sebagaimana dirangkum tabel berikut.

Tipe elemenNilai default
byte, short, int, long0
float, double0.0
char'\u0000', karakter kosong
booleanfalse
tipe referensi seperti Stringnull
java NilaiDefaultArray.java
public class NilaiDefaultArray {
    public static void main(String[] args) {
        int[] angka = new int[3];
        double[] pecahan = new double[3];
        boolean[] status = new boolean[3];
        String[] nama = new String[3];

        System.out.println("int    : " + angka[0]);
        System.out.println("double : " + pecahan[0]);
        System.out.println("boolean: " + status[0]);
        System.out.println("String : " + nama[0]);
    }
}
text Keluaran
int    : 0
double : 0.0
boolean: false
String : null

Aturan ini berbeda dari variabel lokal yang wajib diisi sebelum dibaca. Elemen array selalu diinisialisasi karena array hidup di heap, yakni area memori tempat objek dibuat, dan JVM menjamin setiap sel barunya bernilai default. Untuk tipe referensi, nilai defaultnya null, yakni referensi yang tidak menunjuk objek mana pun, sehingga memanggil metode pada elemen String yang masih null akan melempar NullPointerException.

Membaca length dan melintasi elemen#

Panjang array dibaca dari length yang berupa field, bukan metode, sehingga penulisannya nilai.length tanpa tanda kurung. Kontrasnya, kelas String memiliki metode length() dengan tanda kurung. Keduanya sering tertukar, tetapi kompiler akan menolak nilai.length() dengan pesan bahwa length bukan metode array.

Perulangan for klasik dipilih bila nomor indeks dibutuhkan, misalnya untuk mencetak posisi atau mengisi elemen berdasarkan pola. For-each dipilih bila setiap nilai hanya dibaca sebagaimana adanya, karena penulisannya lebih ringkas dan bebas dari risiko salah indeks. Sebaliknya, for-each tidak dapat mengubah isi array berdasarkan posisi, karena variabel perulangannya hanyalah salinan nilai elemen, bukan sel array itu sendiri. Untuk pengisian atau pemodifikasian elemen, tetap gunakan perulangan berindeks.

Array dua dimensi#

Array dua dimensi menata data dalam baris dan kolom, cocok untuk tabel seperti rekap nilai per siswa dan per tugas. Deklarasi int[][] tabel = new int[4][3] memesan empat baris yang masing-masing berisi tiga kolom, dan elemennya diakses dengan dua indeks, tabel[baris][kolom]. Bentuk literalnya berupa kurung kurawal bertingkat, satu pasang untuk setiap baris.

java TabelNilai.java
public class TabelNilai {
    public static void main(String[] args) {
        int[][] nilai = {
            {80, 75, 90},
            {70, 85, 65},
            {88, 92, 79},
            {60, 70, 82}
        };

        for (int baris = 0; baris < nilai.length; baris++) {
            int totalBaris = 0;
            for (int kolom = 0; kolom < nilai[baris].length; kolom++) {
                System.out.print(nilai[baris][kolom] + " ");
                totalBaris += nilai[baris][kolom];
            }
            System.out.println("| total " + totalBaris);
        }
    }
}
text Keluaran
80 75 90 | total 245
70 85 65 | total 220
88 92 79 | total 259
60 70 82 | total 212

Pada array dua dimensi, nilai.length memberi jumlah baris, sedangkan nilai[baris].length memberi panjang baris tersebut. Perulangan luarnya berjalan atas baris dan perulangan dalamnya berjalan atas kolom baris yang sedang diproses. Pola bersarang ini berlaku untuk dimensi lebih dalam lagi, meskipun tiga dimensi ke atas sudah jarang ditemui dalam program sehari-hari.

Array jagged#

Array jagged adalah array dua dimensi yang panjang barisnya tidak seragam. Kemampuan ini muncul karena array dua dimensi sebenarnya adalah array yang berisi referensi ke array lain, sehingga setiap baris boleh dialokasikan terpisah dengan ukuran sendiri. Kasus yang cocok antara lain segitiga angka, jadwal piket yang jumlah personelnya berubah-ubah, atau data yang beberapa barisnya kosong.

java Contoh: alokasi baris jagged satu per satu
// tidak-dijalankan
int[][] segitiga = new int[4][];
segitiga[0] = new int[1];
segitiga[1] = new int[2];
segitiga[2] = new int[3];
segitiga[3] = new int[4];

Perhatikan bahwa new int[4][] hanya menyebut jumlah barisnya, lalu tiap baris dialokasikan tersendiri. Sebelum baris tertentu dialokasikan, sel array luarnya masih berisi null sesuai nilai default tipe referensi.

Array jagged: array luar menyimpan referensi ke array barispiket, length = 3String[3][]baris 0, length = 2AliBudibaris 1, length = 3CitraDewiEkabaris 2, length = 1Fajar
Array jagged sebagai array luar yang berisi referensi ke array baris berpanjang berbeda

Contoh jadwal piket berikut menyatukan konsep di atas, yaitu array luar berisi tiga referensi menuju array baris dengan panjang dua, tiga, dan satu.

java JadwalPiket.java
public class JadwalPiket {
    public static void main(String[] args) {
        String[][] piket = {
            {"Ali", "Budi"},
            {"Citra", "Dewi", "Eka"},
            {"Fajar"}
        };

        for (int minggu = 0; minggu < piket.length; minggu++) {
            System.out.println("Minggu " + (minggu + 1) + ": "
                    + String.join(", ", piket[minggu]));
        }
    }
}
text Keluaran
Minggu 1: Ali, Budi
Minggu 2: Citra, Dewi, Eka
Minggu 3: Fajar

Kesalahan umum#

  • Mengakses indeks yang sama dengan length. Baris nilai[nilai.length] melempar ArrayIndexOutOfBoundsException karena indeks terakhir adalah length - 1. Biasakan perulangan memakai syarat i < nilai.length.
  • Menulis nilai.length() untuk array. length pada array adalah field, sehingga pemanggilan dengan tanda kurung ditolak kompilator. Padanannya pada String justru metode length().
  • Menganggap new int[3][] langsung siap diisi. Barisnya masih null, sehingga m[0][0] = 1; melempar NullPointerException. Alokasikan tiap baris dengan new terlebih dahulu.
  • Menyalin array lewat penugasan. Baris int[] salinan = nilai; tidak menyalin isi apa pun, melainkan membuat dua nama merujuk array yang sama, sehingga perubahan lewat salah satu nama terlihat oleh yang lain. Kelas java.util.Arrays menyediakan copyOf untuk penyalinan yang sesungguhnya.

Ringkasan#

  • Array adalah wadah berukuran tetap bertipe sama, dibuat dengan new atau literal kurung kurawal, dan diindeks mulai dari 0 sampai length - 1.
  • Elemen array yang dibuat dengan new selalu terisi nilai default, yaitu 0 untuk bilangan bulat, 0.0 untuk pecahan, false untuk boolean, dan null untuk tipe referensi.
  • length berupa field tanpa tanda kurung, dan array dua dimensi sebenarnya adalah array berisi referensi ke array baris.
  • Array jagged memperbolehkan baris berpanjang berbeda karena tiap baris dialokasikan terpisah, dan baris yang belum dialokasikan bernilai null.

Referensi#