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.
// tidak-dijalankan
int[] nilai = new int[5]; // lima elemen, sementara berisi nilai default
int[] nilaiUjian = {80, 75, 90, 60}; // ukuran mengikuti jumlah isinyaBentuk 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[].
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));
}
}nilai[0] = 80
nilai[1] = 75
nilai[2] = 90
nilai[3] = 60
nilai[4] = 85
total = 390
rata-rata = 78.0Program 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 elemen | Nilai default |
|---|---|
byte, short, int, long | 0 |
float, double | 0.0 |
char | '\u0000', karakter kosong |
boolean | false |
tipe referensi seperti String | null |
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]);
}
}int : 0
double : 0.0
boolean: false
String : nullAturan 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.
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);
}
}
}80 75 90 | total 245
70 85 65 | total 220
88 92 79 | total 259
60 70 82 | total 212Pada 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.
// 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.
Contoh jadwal piket berikut menyatukan konsep di atas, yaitu array luar berisi tiga referensi menuju array baris dengan panjang dua, tiga, dan satu.
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]));
}
}
}Minggu 1: Ali, Budi
Minggu 2: Citra, Dewi, Eka
Minggu 3: FajarKesalahan umum#
- Mengakses indeks yang sama dengan
length. Barisnilai[nilai.length]melemparArrayIndexOutOfBoundsExceptionkarena indeks terakhir adalahlength - 1. Biasakan perulangan memakai syarati < nilai.length. - Menulis
nilai.length()untuk array.lengthpada array adalah field, sehingga pemanggilan dengan tanda kurung ditolak kompilator. Padanannya padaStringjustru metodelength(). - Menganggap
new int[3][]langsung siap diisi. Barisnya masihnull, sehinggam[0][0] = 1;melemparNullPointerException. Alokasikan tiap baris dengannewterlebih 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. Kelasjava.util.ArraysmenyediakancopyOfuntuk penyalinan yang sesungguhnya.
Ringkasan#
- Array adalah wadah berukuran tetap bertipe sama, dibuat dengan
newatau literal kurung kurawal, dan diindeks mulai dari 0 sampailength - 1. - Elemen array yang dibuat dengan
newselalu terisi nilai default, yaitu0untuk bilangan bulat,0.0untuk pecahan,falseuntukboolean, dannulluntuk tipe referensi. lengthberupa 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#
- Arrays (The Java Tutorials) — Oracle — Rujukan resmi deklarasi, pengisian, dan pelintasan array di Java.
- Chapter 10. Arrays — JLS Java SE 21 — Spesifikasi bahasa untuk tipe array, termasuk nilai default elemennya.