List yang Ukurannya Menyesuaikan Sendiri
Array biasa di Java punya panjang tetap: kalau kamu memutuskan sepuluh slot, selamanya kamu punya sepuluh slot. ArrayList adalah alternatif dari java.util yang ukurannya bisa berubah. Ia membesar saat kamu menambah elemen dan mengecil saat kamu menghapusnya, dan punya method praktis untuk hal-hal yang memang biasa kamu lakukan dengan sebuah list.
Perhatikan tipe di dalam kurung sudut, List<String>, yang memberi tahu compiler bahwa list ini berisi nilai String. Tanda <> (disebut "diamond") di sebelah kanan membuat Java menyimpulkan tipe yang sama tanpa perlu ditulis ulang. Perhatikan juga bahwa kamu meng-import java.util.ArrayList; class ini tidak tersedia secara default.
Deklarasikan sebagai List, Buat sebagai ArrayList
Kamu hampir selalu akan melihat variabelnya diberi tipe interface List, bukan class konkret ArrayList:
List<String> names = new ArrayList<>();
Ini kebiasaan yang baik, bukan aturan. Menulis kode berdasarkan interface List berarti bagian lain dari kodemu tidak peduli implementasi list mana yang kamu pakai, sehingga kamu bisa menggantinya nanti tanpa menyentuh kode itu. Untuk penggunaan sehari-hari, keduanya berperilaku sama.
Menambah, Mengambil, dan Mengubah Elemen
add(value)menambahkan elemen di akhir.add(index, value)menyisipkan elemen di sebuah posisi dan menggeser elemen setelahnya ke kanan.get(index)membaca elemen di sebuah posisi (dimulai dari nol).set(index, value)menimpa elemen yang sudah ada.
Index dimulai dari nol, dan get pada index di luar jangkauan akan melempar IndexOutOfBoundsException.
Menghapus Elemen
Ada jebakan klasik saat list berisi Integer. remove(int) berarti "hapus berdasarkan index", sedangkan remove(Object) berarti "hapus berdasarkan nilai", jadi:
List<Integer> nums = new ArrayList<>(List.of(10, 20, 30));
nums.remove(1); // removes index 1 -> the value 20
nums.remove(Integer.valueOf(20)); // removes the value 20
Bungkus nilainya dengan Integer.valueOf(...) kalau maksudmu "hapus nilai ini", bukan "hapus index ini".
Size, Contains, dan Mencari Index
List.of(...) membuat list immutable dengan cepat; kalau kamu memberikannya ke constructor ArrayList, kamu mendapat salinan yang bisa diubah dan sudah berisi nilai-nilai tersebut.
Perulangan pada ArrayList
Loop yang paling rapi adalah for versi enhanced (for-each loop):
Kalau kamu juga butuh index-nya, pakai loop dengan penghitung menggunakan size() dan get(i):
Satu aturan: jangan menambah atau menghapus elemen dari list saat for-each loop sedang menelusurinya, karena itu akan melempar ConcurrentModificationException. Untuk menghapus elemen yang cocok dengan aman, pakai removeIf:
Mengurutkan
Collections.sort mengurutkan list di tempatnya (in place) berdasarkan urutan alaminya (alfabetis untuk string, numerik untuk angka):
Untuk urutan khusus, berikan Comparator ke list.sort(...), misalnya names.sort(Comparator.comparingInt(String::length)) untuk mengurutkan berdasarkan panjangnya.
ArrayList Menyimpan Objek, Bukan Primitif
Kamu tidak bisa menulis ArrayList<int>. Generics hanya bekerja dengan tipe objek, jadi pakai wrapper class Integer, Double, Boolean, dan seterusnya:
Autoboxing di Java mengonversi antara int dan Integer untukmu, jadi kodenya tetap enak dibaca. Ingat saja bahwa list itu sendiri menyimpan objek Integer.
Berikutnya: HashMap
ArrayList adalah alat yang tepat kalau kamu peduli pada urutan dan posisi. Kalau kamu perlu mencari sesuatu berdasarkan sebuah key, misalnya username ke data user atau kode produk ke harga, yang kamu butuhkan adalah HashMap, dan itu topik halaman berikutnya.
Pertanyaan yang sering diajukan
Bagaimana cara membuat ArrayList di Java?
Deklarasikan dengan tipe elemen di dalam kurung sudut, lalu panggil constructor-nya: ArrayList<String> names = new ArrayList<>();. Tanda <> di sebelah kanan (disebut diamond) membuat Java menyimpulkan tipenya sendiri. Biasanya variabelnya diberi tipe interface List: List<String> names = new ArrayList<>();.
Apa perbedaan array dan ArrayList di Java?
Array biasa punya panjang tetap yang ditentukan saat dibuat dan bisa menyimpan tipe primitif seperti int. ArrayList membesar dan mengecil otomatis saat kamu menambah dan menghapus elemen, hanya menyimpan objek (jadi int menjadi Integer), dan punya method seperti add, remove, contains, dan size. Pakai array untuk data primitif yang ukurannya tetap; pakai ArrayList kalau ukurannya berubah-ubah.
Bagaimana cara menghapus elemen dari ArrayList?
Panggil remove(index) untuk menghapus berdasarkan posisi, atau remove(object) untuk menghapus elemen pertama yang cocok. Hati-hati dengan list Integer: list.remove(2) menghapus index 2, sedangkan list.remove(Integer.valueOf(2)) menghapus nilai 2. Untuk menghapus sambil melakukan perulangan, pakai remove() milik Iterator atau removeIf(...) supaya tidak terkena ConcurrentModificationException.