Dalam pemrograman Java, “List” adalah struktur data yang sangat sering muncul. Terutama dalam situasi di mana Anda ingin mengelola banyak nilai sekaligus, List lebih fleksibel dan mudah digunakan dibandingkan array, sehingga sangat dihargai di banyak lingkungan kerja. “List” adalah antarmuka inti dari Java Collections Framework, dan melalui berbagai kelas implementasi seperti ArrayList dan LinkedList, tersedia mekanisme yang dapat menangani berbagai situasi. Kemampuan untuk melakukan operasi seperti penambahan, penghapusan, pencarian, dan pembaruan data secara intuitif juga merupakan salah satu alasan List didukung.
Tujuan dan Target Pembaca Artikel Ini
Artikel ini akan menjelaskan dasar-dasar hingga aplikasi dari “Java List” secara sistematis dan mudah dipahami bagi pemula. Target utama pembaca adalah sebagai berikut:
Mereka yang baru mulai belajar Java dan merasa tidak yakin tentang cara menggunakan List.
Mereka yang ingin memahami dengan jelas perbedaan antara array (Array) dan List.
Mereka yang bingung memilih antara ArrayList dan LinkedList.
Mereka yang ingin meninjau dasar-dasar List untuk menggunakannya dalam pekerjaan praktis.
Setelah selesai membaca artikel ini, Anda diharapkan akan memahami dengan kuat pemikiran dasar, metode implementasi, dan operasi spesifik dari List dalam Java, serta dapat melakukan coding dengan percaya diri. Pada bab berikutnya, kita akan mulai menjelaskan dari bagian dasar, yaitu “Apa itu List?”, secara bertahap.
2. Apa Itu List?
Gambaran Umum dan Karakteristik List
Dalam Java, “List” adalah antarmuka koleksi yang menyimpan elemen-elemen dalam urutan tertentu. Ciri terbesarnya adalah urutan penambahan elemen dipertahankan, dan elemen individual dapat diakses menggunakan indeks (dimulai dari 0). List disediakan sebagai bagian dari Collections Framework dan memiliki fungsi-fungsi berikut:
Mengizinkan duplikasi elemen
Dapat mengambil, memperbarui, dan menghapus elemen dengan menentukan indeks
Jumlah elemen dapat bertambah atau berkurang secara dinamis (tidak memiliki panjang tetap seperti array)
Dengan demikian, operasi data yang fleksibel menjadi mungkin, dan sangat sering digunakan dalam pekerjaan praktis.
Perbedaan dengan Array
Dalam Java, array (seperti int[] atau String[]) juga ada sebagai cara untuk menyimpan banyak nilai, tetapi ada beberapa perbedaan dengan List.
Item Perbandingan
Array
List
Perubahan Jumlah Elemen
Tidak Bisa (Panjang Tetap)
Bisa (Dapat Bertambah/Berkurang Secara Dinamis)
Fungsi yang Disediakan
Operasi Minimum (Akses Indeks, Mendapatkan Panjang)
Metode Berlimpah (add, remove, contains, dll.)
Tipe
Dapat Menangani Tipe Primitif
Hanya Tipe Objek (Memerlukan Wrapper Class)
Keamanan Tipe
Array Diperiksa Tipe Saat Kompilasi
Dapat Menentukan Tipe Secara Ketat dengan Generics
Dengan demikian, List adalah koleksi yang lebih fleksibel dan berfitur lengkap, dan seringkali lebih praktis daripada array dalam banyak situasi.
Antarmuka List dan Kelas Implementasinya
Saat menggunakan List dalam Java, pada dasarnya Anda mendeklarasikan variabel menggunakan antarmuka List dan membuat instance dengan kelas konkret (kelas implementasi). Kelas implementasi yang 대표的な adalah sebagai berikut:
ArrayList Struktur mirip array memungkinkan akses cepat. Kuat dalam pencarian data dan akses acak.
LinkedList Setiap elemen terhubung dengan elemen sebelumnya dan berikutnya. Penyisipan/penghapusan cepat, cocok untuk daftar yang sering mengalami operasi.
Vector Mirip dengan ArrayList, tetapi thread-safe sehingga sedikit lebih lambat. Saat ini jarang digunakan.
Secara umum, ArrayList adalah yang paling sering digunakan kecuali ada alasan khusus. Anda dapat memilih penggunaannya dengan merujuk pada perbandingan kinerja yang akan dibahas nanti, tergantung pada tujuan.
3. Cara Penggunaan Dasar List
Bab ini akan menjelaskan operasi dasar saat menggunakan List dalam Java secara bertahap. Di sini, terutama menggunakan ArrayList sebagai contoh, kami akan memperkenalkan operasi representatif dari List.
Deklarasi dan Inisialisasi List
Pertama, deklarasi dan inisialisasi dasar dari List menggunakan ArrayList.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
}
}
Umumnya, variabel dideklarasikan dengan antarmuka List dan di-instance dengan ArrayList. Tipe data yang akan disimpan (dalam contoh ini String) ditentukan menggunakan Generics.
Penambahan Elemen (add)
Untuk menambahkan elemen ke List, gunakan metode add().
Untuk memeriksa apakah elemen tertentu terkandung dalam List, gunakan contains().
if (fruits.contains("ぶどう")) {
System.out.println("ぶどう ada");
}
Ringkasan: Daftar Operasi Dasar yang Sering Digunakan
Operasi
Contoh Metode
Penjelasan
Penambahan
add("elemen")
Ditambahkan di akhir
Pengambilan
get(indeks)
Mengambil referensi elemen
Pembaruan
set(indeks, elemen_baru)
Mengubah elemen pada posisi yang ditentukan
Penghapusan
remove(indeks/elemen)
Menghapus elemen yang ditentukan
Pengambilan Ukuran
size()
Mengambil jumlah elemen
Pemeriksaan Keberadaan
contains("elemen")
Memeriksa keberadaan elemen tertentu
4. Contoh Operasi List
Pada bab ini, kami akan memperkenalkan contoh operasi nyata menggunakan List dalam Java. Situasi di mana elemen dalam daftar perlu diproses secara berurutan sangat sering terjadi, dan di sini kami akan membahas metode representatif menggunakan for loop, enhanced for loop, dan Stream API.
Iterasi dengan for loop
Metode yang paling dasar adalah menggunakan for loop untuk mengambil elemen menggunakan indeks.
List<String> fruits = new ArrayList<>();
fruits.add("りんご");
fruits.add("バナナ");
fruits.add("みかん");
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
Metode ini memungkinkan kontrol detail menggunakan indeks. Misalnya, efektif ketika Anda hanya ingin memproses elemen pada posisi genap.
Iterasi dengan enhanced for loop (for-each)
Jika Anda ingin memproses semua elemen secara berurutan tanpa mempedulikan indeks, enhanced for loop sangat nyaman.
for (String fruit : fruits) {
System.out.println(fruit);
}
Penulisannya sederhana dan mudah dibaca, menjadikannya salah satu metode yang paling sering digunakan. Untuk pemrosesan yang sederhana, metode ini sudah cukup.
Iterasi dengan Lambda Expression dan Stream API
Sejak Java 8, cara penulisan menggunakan Stream API dan lambda expression juga dimungkinkan.
Keunggulan notasi ini adalah kemampuannya untuk menggabungkan beberapa proses secara berantai. Misalnya, memfilter dengan kondisi tertentu sebelum mencetak dapat dilakukan dengan mudah.
Contoh ini akan mencetak hanya buah-buahan yang mengandung karakter “ん”. Metode ini sangat direkomendasikan bagi mereka yang ingin terbiasa dengan coding gaya fungsional.
Memilih Metode Penggunaan
Metode
Keunggulan
Cocok untuk Situasi
for loop Biasa
Memungkinkan kontrol indeks
Pemrosesan yang memerlukan nomor elemen
enhanced for loop
Penulisan sederhana dan mudah dibaca
Pemrosesan iterasi sederhana
Stream API
Kuat untuk pemrosesan bersyarat dan berantai
Ketika ingin menggabungkan filter, map, dan agregasi
5. Perbedaan dan Penggunaan ArrayList dan LinkedList
Sebagai kelas implementasi representatif dari antarmuka List Java, terdapat ArrayList dan LinkedList. Keduanya dapat digunakan sebagai List secara serupa, tetapi penting untuk memilih penggunaannya dengan tepat di situasi yang sesuai karena perbedaan dalam struktur internal dan karakteristik kinerja.
Karakteristik dan Kasus Penggunaan yang Tepat untuk ArrayList
ArrayListsecara internal menggunakan array dinamis (array dengan ukuran variabel).
Karakteristik Utama:
Sangat cepat untuk akses acak (akses dengan indeks)
Penambahan elemen cepat jika di akhir list (rata-rata O(1))
Penyisipan/penghapusan di tengah menjadi lambat (O(n))
Cocok untuk Situasi:
Situasi yang sering melakukan pencarian (get())
Situasi di mana jumlah elemen dapat diprediksi sampai batas tertentu sebelumnya
Pemrosesan yang jarang melakukan penambahan/penghapusan elemen, berorientasi baca
List<String> list = new ArrayList<>();
Karakteristik dan Kasus Penggunaan yang Tepat untuk LinkedList
LinkedList diimplementasikan dengan struktur daftar terhubung ganda.
Karakteristik Utama:
Penambahan/penghapusan elemen cepat (terutama di awal atau akhir)
Akses acak (get(index)) lambat (O(n))
Konsumsi memori sedikit lebih banyak daripada ArrayList
Cocok untuk Situasi:
Situasi yang sering melakukan penyisipan/penghapusan elemen (terutama di awal atau tengah)
Ketika ingin menggunakannya seperti Queue atau Stack
Ketika berorientasi iterasi dan akses indeks tidak diperlukan
List<String> list = new LinkedList<>();
Perbandingan Kinerja
Tabel di bawah ini menunjukkan kompleksitas komputasi teoritis (notasi Big O) untuk operasi yang sering digunakan.
Operasi
ArrayList
LinkedList
get(int index)
O(1)
O(n)
add(E e) (di akhir)
O(1)
O(1)
add(int index, E e)
O(n)
O(n)
remove(int index)
O(n)
O(n)
Iterasi
O(n)
O(n)
※ Waktu pemrosesan aktual juga dipengaruhi oleh ukuran data, optimasi JVM, dll.
Poin Penting dalam Memilih Penggunaan di Praktik
Jika “mengelola data sebagai daftar dan mengaksesnya dengan indeks”, gunakan ArrayList
Jika “sering terjadi penyisipan/penghapusan di awal/tengah”, gunakan LinkedList
Dalam pemrosesan yang kritis terhadap kinerja, pastikan untuk melakukan benchmark dan validasi
6. Cara Penggunaan List Tingkat Lanjut
Di sini, kami akan memperkenalkan teknik tingkat lanjut untuk menggunakan List Java dengan lebih nyaman. List tidak hanya berfungsi sebagai kumpulan data, tetapi juga dapat melakukan berbagai pemrosesan melalui sort, shuffle, filter, transform, dll.
Sortir List (Collections.sort)
Menggunakan Collections.sort(), elemen dalam List dapat diurutkan secara ascending (naik). Elemen harus mengimplementasikan antarmuka Comparable.
Jika Anda ingin mengubah elemen ke format lain, gunakan map().
List<Integer> lengths = fruits.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths); // Jumlah karakter nama setiap buah [3, 3, 2] dst.
map() adalah alat yang kuat dalam konversi format data dan preprocessing.
Ringkasan Operasi Tingkat Lanjut
Operasi
Contoh Penggunaan
Kegunaan Utama
Sortir
Collections.sort(list)
Mengurutkan secara ascending
Mengacak
Collections.shuffle(list)
Mengacak urutan elemen
Filter
stream().filter(...).collect()
Mengekstrak hanya elemen yang memenuhi kondisi
Transformasi
stream().map(...).collect()
Mengubah tipe atau nilai elemen
7. Kesalahan Umum dan Cara Mengatasinya
Saat menangani List dalam Java, salah satu hal yang paling sering membuat pemula tersandung adalah “Exception (Error)”. Di sini, kami akan secara spesifik menjelaskan kesalahan representatif yang sering terjadi dalam praktik, serta penyebab dan cara mengatasinya.
IndexOutOfBoundsException (Error Indeks di Luar Batas)
Penyebab:
Terjadi ketika mencoba mengakses indeks yang tidak ada.
List<String> list = new ArrayList<>();
list.add("りんご");
System.out.println(list.get(1)); // Error: Index 1 out of bounds
Cara Mengatasi:
Periksa ukuran sebelum mengakses, atau kontrol dengan percabangan kondisi apakah indeks valid.
if (list.size() > 1) {
System.out.println(list.get(1));
}
NullPointerException
Penyebab:
Terjadi ketika memanggil metode pada List itu sendiri atau elemen List yang bernilai null.
List<String> list = null;
list.add("りんご"); // NullPointerException terjadi
Cara Mengatasi:
Pastikan variabel tidak null sebelumnya, atau gunakan Optional, dll.
if (list != null) {
list.add("りんご");
}
Atau, perhatikan agar tidak lupa melakukan inisialisasi:
List<String> list = new ArrayList<>(); // Inisialisasi yang benar
ConcurrentModificationException
Penyebab:
Terjadi ketika List diubah secara langsung saat melakukan iterasi dengan for-each loop atau Iterator.
for (String fruit : list) {
if (fruit.equals("バナナ")) {
list.remove(fruit); // ConcurrentModificationException
}
}
Cara Mengatasi:
Gunakan Iterator untuk menghapus dengan aman, atau gunakan metode seperti removeIf().
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("バナナ")) {
it.remove(); // Dihapus dengan aman
}
}
Atau, sejak Java 8, secara ringkas:
list.removeIf(fruit -> fruit.equals("バナナ"));
Poin Perhatian Lainnya
Konfirmasi bahwa List tidak null
Sangat sering terjadi kasus di mana variabel hanya dideklarasikan tetapi tidak digunakan. Inisialisasi adalah keharusan.
Pemahaman bahwa indeks dimulai dari 0
Seringkali pemula salah paham bahwa “elemen pertama adalah indeks 1”.
Ringkasan Penanganan Error
Nama Error
Penyebab Utama
Contoh Cara Mengatasi
IndexOutOfBoundsException
Akses ke indeks yang tidak ada
Periksa panjang dengan size()
NullPointerException
List atau elemen bernilai null
Jangan lupa inisialisasi, lakukan null check
ConcurrentModificationException
Mengubah List secara langsung saat iterasi
Operasi dengan Iterator atau manfaatkan removeIf()
8. Ringkasan
Meninjau Kembali Dasar-dasar Java List
Dalam artikel ini, kami telah menjelaskan dasar-dasar hingga aplikasi dari List dalam Java secara bertahap. List adalah salah satu koleksi yang paling sering digunakan dalam Java, dan merupakan alat penting untuk menangani data secara fleksibel. Pertama, setelah memahami apa itu List, kami mempelajari poin-poin berikut:
List adalah koleksi berurutan dan mengizinkan duplikasi, memungkinkan operasi indeks
Ada kelas implementasi representatif seperti ArrayList dan LinkedList, dengan karakteristik dan kegunaan yang berbeda
Operasi data dapat dilakukan secara bebas dengan menguasai operasi dasar (penambahan, pengambilan, pembaruan, penghapusan, pencarian)
Pemrosesan iterasi sesuai situasi seperti for loop, enhanced for loop, dan Stream API
Juga mendukung pemrosesan tingkat lanjut seperti sort, filter, dan transform
Memahami error umum serta penyebab dan cara mengatasinya dapat mencegah masalah sejak dini
Memilih Penggunaan ArrayList dan LinkedList
Penting untuk memilih implementasi List yang tepat sesuai dengan isi pemrosesan dan volume data. Pertimbangan berikut dapat menjadi panduan:
ArrayList: Sering terjadi akses acak, dan pemrosesan berorientasi baca
LinkedList: Sering terjadi penyisipan/penghapusan, dan urutan akses penting
Untuk Pembelajaran Selanjutnya
List hanyalah “pintu masuk” ke Collections dalam Java. Untuk menangani struktur data dan utilitas yang lebih canggih, akan baik untuk memperdalam pemahaman tentang kelas/fungsi berikut:
Set・Map: Manajemen elemen unik, struktur pasangan kunci-nilai
Collections utility class: Sortir, mendapatkan nilai minimum/maksimum, dll.
Pemahaman Generics: Operasi koleksi yang tipe-aman
Menguasai dasar-dasar List akan membuat seluruh pemrograman Java menjadi jauh lebih mudah.
Pertanyaan yang Sering Diajukan (FAQ)
Kami telah merangkum poin-poin yang sering membuat pemula bingung terkait Java List. Kami telah memilih konten yang sering ditemui dalam praktik.
Q1. Apa perbedaan antara Java List dan array (Array)?
A. Array memiliki jumlah elemen tetap dan perlu ditentukan ukurannya saat deklarasi. Di sisi lain, List memiliki ukuran yang variabel, memungkinkan penambahan dan penghapusan elemen secara fleksibel. Selain itu, List dilengkapi dengan banyak metode yang nyaman (add, remove, contains, dll.), dan juga lebih unggul dalam hal keterbacaan dan pemeliharaan.
Q2. Saya harus menggunakan ArrayList atau LinkedList?
A.ArrayList lebih cocok jika sering terjadi akses acak (pengambilan dengan menentukan indeks). LinkedList lebih cocok jika sering terjadi penyisipan/penghapusan elemen. Jika ragu, umumnya disarankan untuk memulai dengan ArrayList.
Q3. Bisakah List menyimpan tipe primitif (int, double, dll.)?
A. Tidak secara langsung. Karena List Java hanya menangani tipe objek, untuk tipe primitif seperti int, Anda perlu menggunakan wrapper class yang sesuai (Integer, Double, dll.).
List<Integer> numbers = new ArrayList<>();
numbers.add(10); // Auto-boxing dan disimpan sebagai tipe Integer
Q4. Saya ingin mengurutkan elemen List, bagaimana caranya?
A. Anda dapat mengurutkan secara ascending menggunakan Collections.sort(list). Juga, jika Anda ingin mengurutkan dengan urutan kustom, Anda dapat menentukan Comparator untuk mengurutkan dengan bebas.
Q5. Bagaimana cara mengelola elemen tanpa duplikasi?
A. List adalah koleksi yang mengizinkan duplikasi. Jika Anda ingin menghindari duplikasi, pertimbangkan penggunaan Set (contoh: HashSet). Namun, perlu diperhatikan bahwa urutan tidak dijamin. Jika Anda ingin menghilangkan duplikasi sambil tetap menggunakan List, pemrosesan Stream berikut juga memungkinkan.
A. Menggunakan metode clear() akan menghapus semua elemen List.
list.clear();
Q7. Operasi apa yang paling sering digunakan dalam List?
A. Operasi yang paling sering digunakan di lapangan adalah add (penambahan), get (pengambilan), remove (penghapusan), dan size (pengambilan ukuran). Dengan menguasai ini, pemrosesan dasar hampir seluruhnya tercakup.