Array Adalah List Berukuran Tetap
Array di Java menyimpan sejumlah nilai yang jumlahnya tetap dan bertipe sama, tersusun berurutan, dan diakses berdasarkan posisinya. Kata kuncinya adalah "tetap": begitu array dibuat, panjangnya tidak pernah berubah. Lalu "bertipe sama": int[] hanya menyimpan nilai int, String[] hanya menyimpan string. Kekakuan itu adalah harga yang dibayar agar array cepat dan hemat memori.
Kamu mendeklarasikan tipe array dengan menaruh [] setelah tipe elemennya, lalu memberinya nilai literal atau mengalokasikannya dengan new:
Kurung siku bisa diletakkan setelah tipe (int[] scores) atau setelah nama (int scores[]). Keduanya bisa dikompilasi, tetapi int[] scores adalah gaya yang lazim di Java: taruh [] bersama tipenya, di tempat yang semestinya.
Membuat Array dengan new
Kalau kamu belum tahu nilainya tetapi sudah tahu ukurannya, pakai new. Ini mengalokasikan slot-slotnya dan mengisinya dengan nilai default dari tipe tersebut:
Nilai default ini bukan sampah acak: Java menginisialisasi setiap elemen dengan nilai nol. Tipe numerik dimulai dari 0 (atau 0.0), boolean dimulai dari false, dan tipe referensi seperti String dimulai dari null. Nilai null ini patut diingat: String[] yang baru dialokasikan penuh dengan null, dan memanggil method pada salah satunya akan melempar NullPointerException.
Index Dimulai dari Nol
Kamu membaca dan menulis elemen berdasarkan index, dihitung mulai dari 0. Index valid terakhir selalu length - 1:
Berbeda dengan array di beberapa bahasa scripting, keluar dari jangkauan tidak diam-diam memberimu null atau undefined, melainkan melempar exception. Coba baca index yang tidak ada:
Program itu crash dengan pesan:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3
Ini salah satu error yang paling sering dialami pemula. Penyebabnya hampir selalu kesalahan selisih satu (off-by-one) pada kondisi loop, yaitu memakai <= padahal maksudnya <.
length Adalah Field, Bukan Method
Setiap array membawa ukurannya di field length. Perhatikan: tanpa tanda kurung.
Ada jebakan yang pernah mengenai semua orang setidaknya sekali: array memakai .length (field), tetapi String memakai .length() (method). Menulis nums.length() pada array menghasilkan error kompilasi, begitu juga menulis text.length pada string. Kata yang sama, aturan yang berbeda: yang untuk array tidak pakai tanda kurung.
Perulangan pada Array
Kamu sudah mempelajari for-each loop di halaman sebelumnya, dan itulah cara paling rapi untuk membaca setiap elemen saat kamu tidak butuh index-nya:
Kalau kamu butuh index, misalnya untuk mencetak nomor posisi, mengubah elemen di tempatnya, atau menelusuri dari belakang, pakai for loop klasik dengan index dan length sebagai batasnya:
Kondisinya adalah i < names.length, bukan <=. Memakai <= membuat loop berjalan satu langkah terlalu jauh dan melempar exception di luar jangkauan seperti di bagian sebelumnya. Aturan singkatnya: for-each kalau kamu hanya membaca nilai, for dengan index kalau kamu butuh posisinya atau ingin menulis kembali ke array.
Array Multidimensi
Array 2D sebenarnya adalah array yang berisi array. Bayangkan sebagai kisi baris dan kolom. Kamu menambahkan pasangan kurung siku kedua:
grid[row][column] memilih satu sel. Karena setiap baris adalah array tersendiri, grid.length adalah jumlah baris dan grid[0].length adalah jumlah kolom di baris pertama. Panjang setiap baris bahkan tidak harus sama (disebut jagged array), meskipun sebagian besar kisi berbentuk persegi panjang.
Class Pembantu Arrays
Array sendiri hampir tidak punya method: kamu tidak bisa mengurutkan atau mencetaknya secara langsung dengan cara yang berguna. Java menyediakan class utilitas java.util.Arrays yang penuh dengan helper static untuk keperluan ini:
Ada beberapa hal yang bisa kamu andalkan di sini. Arrays.toString(arr) adalah cara yang benar untuk mencetak array; mencetaknya secara langsung hanya menghasilkan string tak berguna seperti [I@1b6d3586. Arrays.sort mengurutkan di tempatnya. Arrays.copyOf adalah cara untuk "mengubah ukuran": ia mengembalikan array baru dengan panjang yang kamu minta, diisi nilai default (dua slot tambahan di atas bernilai 0). Terakhir, Arrays.binarySearch hanya bekerja dengan benar pada array yang sudah terurut.
Array vs ArrayList
Pakai array biasa kalau ukurannya sudah diketahui sejak awal dan tidak akan berubah, misalnya daftar hari kerja yang tetap, papan permainan, atau data piksel. Array cepat dan ringan, tetapi panjangnya yang tetap adalah batasan nyata: kamu tidak bisa menambahkan elemen ketujuh ke array sepanjang 6 tanpa membuat array yang benar-benar baru.
Begitu kamu perlu menambah dan menghapus item dengan bebas, array jadi merepotkan. Untuk itulah ArrayList ada: list yang ukurannya bisa berubah dan bisa bertambah, yang mengurus proses penyalinan untukmu.
Berikutnya: ArrayList
Kalau kamu tidak tahu berapa banyak item yang akan kamu punya, atau jumlahnya berubah saat program berjalan, array dengan panjang tetap justru menghalangi. ArrayList adalah jawaban Java: list yang membesar dan mengecil sesuai kebutuhan, dengan method add dan remove sebagai pengganti mengatur-atur index. Itu topik berikutnya.
Pertanyaan yang sering diajukan
Bagaimana cara mendeklarasikan dan menginisialisasi array di Java?
Deklarasikan tipenya dengan kurung siku lalu beri nilai literal: int[] nums = {1, 2, 3};. Untuk membuat array kosong dengan ukuran tetap, pakai new: int[] nums = new int[5];. Hasilnya 5 slot, masing-masing berisi nilai default (0 untuk int, null untuk objek).
Bagaimana cara mengetahui panjang array di Java?
Pakai field length (tanpa tanda kurung): nums.length. Ini field, bukan method, jadi nums.length() menghasilkan error kompilasi. Perhatikan bahwa String memakai .length() dengan tanda kurung, sedangkan array memakai .length tanpa tanda kurung. Ini kekeliruan yang klasik.
Apakah ukuran array di Java bisa berubah setelah dibuat?
Tidak. Array di Java punya panjang tetap yang ditentukan saat dibuat, dan kamu tidak bisa memperbesar atau memperkecilnya. Kalau kamu butuh list yang ukurannya bisa berubah, pakai ArrayList. Untuk "mengubah ukuran" array, kamu harus membuat array baru yang lebih besar lalu menyalin elemennya ke sana.
Apa itu ArrayIndexOutOfBoundsException di Java?
Itu error runtime yang muncul saat kamu mengakses index yang tidak ada, yaitu di bawah 0 atau >= array.length. Berbeda dengan beberapa bahasa lain, Java tidak mengembalikan nilai default atau null untuk akses di luar jangkauan; Java melempar exception. Index yang valid selalu berkisar dari 0 sampai length - 1.