- 1 1. Pengenalan
- 2 2. Apa itu List?
- 3 3. Penggunaan Dasar List
- 4 4. List Operation Examples
- 5 5. Differences and Usage of ArrayList and LinkedList
- 6 6. Penggunaan Lanjutan List
- 7 7. Kesalahan Umum dan Solusinya
- 8 8. Kesimpulan
- 9 Pertanyaan yang Sering Diajukan (FAQ)
- 9.1 Q1. Apa perbedaan antara List dan Array di Java?
- 9.2 Q2. Mana yang sebaiknya saya gunakan, ArrayList atau LinkedList?
- 9.3 Q3. Bisakah saya menyimpan tipe primitif (seperti int atau double) dalam sebuah List?
- 9.4 Q4. Bagaimana cara saya mengurutkan elemen dalam sebuah List?
- 9.5 Q5. Apa yang harus saya lakukan jika ingin mengelola elemen tanpa duplikat?
- 9.6 Q6. Apa yang harus saya lakukan ketika ingin menghapus semua elemen dari sebuah List?
- 9.7 Q7. Apa saja operasi yang paling sering digunakan pada List?
1. Pengenalan
Apa Pentingnya List dalam Java?
Dalam pemrograman Java, “List” adalah struktur data yang muncul sangat sering. Terutama dalam situasi di mana Anda ingin mengelola beberapa nilai bersama-sama, ia lebih fleksibel dan lebih mudah digunakan daripada array, menjadikannya sangat dihargai dalam banyak skenario praktis.
“List” adalah antarmuka inti dalam Java Collections Framework dan menyediakan mekanisme untuk menangani berbagai situasi melalui kelas implementasi yang berbeda seperti ArrayList dan LinkedList. Kemampuan untuk melakukan operasi seperti menambahkan, menghapus, mencari, dan memperbarui data secara intuitif adalah salah satu alasan mengapa List disukai.
Tujuan dan Audiens Target Artikel Ini
Artikel ini akan menjelaskan secara sistematis “Java List” dari dasar hingga topik lanjutan dengan cara yang mudah dipahami bagi pemula. Audiens utama adalah sebagai berikut:
- Mereka yang baru mulai belajar Java dan tidak yakin tentang cara menggunakan List
- Mereka yang ingin memahami dengan jelas perbedaan antara Array dan List
- Mereka yang kesulitan memilih antara ArrayList dan LinkedList
- Mereka yang ingin meninjau dasar-dasar sebelum menggunakan List dalam praktik
Setelah selesai membaca artikel ini, tujuan kami adalah agar Anda memperoleh pemahaman yang solid tentang konsep dasar, metode implementasi, dan operasi spesifik List dalam Java, sehingga Anda dapat coding dengan percaya diri.
Dari bab selanjutnya, kami akan mulai menjelaskan bagian dasar, “Apa itu List?”, secara bertahap.
2. Apa itu List?
Gambaran Umum dan Karakteristik List
“List” dalam Java adalah antarmuka koleksi yang menyimpan elemen dalam urutan yang terurut. Fitur 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 fitur berikut:
- Mengizinkan elemen duplikat
- Dapat mengambil, memperbarui, dan menghapus elemen dengan menentukan indeks
- Dapat secara dinamis menambah atau mengurangi jumlah elemen (tidak seperti array, ukurannya tidak tetap)
Hal ini memungkinkan manipulasi data yang fleksibel dan sangat sering digunakan dalam pekerjaan praktis.
Perbedaan dengan Array
Dalam Java, array (seperti int[] atau String[]) juga ada sebagai sarana untuk menyimpan beberapa nilai, tetapi ada beberapa perbedaan dengan List.
| Comparison Item | Array | List |
|---|---|---|
| Changing number of elements | Not possible (fixed-size) | Possible (can increase/decrease dynamically) |
| Provided functionality | Minimal operations (indexed access, length retrieval) | Rich methods (add, remove, contains, etc.) |
| Type | Can handle primitive types | Object types only (wrapper classes required) |
| Type safety | Arrays checked at compile time | Can strictly specify type with Generics |
Seperti itu, List adalah koleksi yang lebih fleksibel dan kaya fitur, menjadikannya lebih praktis daripada array dalam banyak situasi.
Antarmuka List dan Kelas Implementasinya
Saat menggunakan List dalam Java, Anda biasanya mendeklarasikan variabel menggunakan antarmuka List dan membuat instance dengan kelas tertentu (kelas implementasi). Kelas implementasi representatif adalah sebagai berikut:
- ArrayList Struktur mirip dengan array, memungkinkan akses cepat. Kuat untuk mencari data dan akses acak.
- LinkedList Diimplementasikan dengan struktur daftar terkait ganda. Cepat untuk penyisipan dan penghapusan, cocok untuk daftar di mana operasi sering dilakukan.
- Vector Mirip dengan ArrayList tetapi sedikit lebih berat karena thread-safe. Tidak banyak digunakan saat ini.
Secara umum, ArrayList adalah yang paling sering digunakan kecuali ada alasan khusus. Baik untuk memilih yang sesuai berdasarkan perbandingan performa yang dijelaskan nanti, tergantung pada kasus penggunaan.
3. Penggunaan Dasar List
Bagian ini menjelaskan operasi dasar saat menggunakan List dalam Java secara bertahap. Di sini, kami akan terutama menggunakan ArrayList sebagai contoh untuk memperkenalkan operasi representatif List.
Deklarasi dan Inisialisasi List
Pertama, mari kita lihat deklarasi dan inisialisasi dasar 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<>();
}
}
It is common practice to declare a variable with the List interface and instantiate it with ArrayList. Generics are used to specify the type to be stored (here, String).
Adding Elements (add)
To add elements to a List, use the add() method.
fruits.add("apple");
fruits.add("banana");
fruits.add("orange");
This adds three elements to the List in sequence. List preserves the order of addition.
Getting Elements (get)
To get an element at a specified index, use get(int index).
System.out.println(fruits.get(0)); // "apple" will be displayed
Note that indices start from 0.
Updating Elements (set)
To update an element at a certain position, use set(int index, E element).
fruits.set(1, "grape"); // The second element "banana" is replaced with "grape"
Removing Elements (remove)
You can also remove elements by a specific index or the element itself.
fruits.remove(0); // Removes the first element
fruits.remove("orange"); // Removes "orange" (only the first match)
Getting List Size (size)
The current number of elements can be obtained with the size() method.
System.out.println(fruits.size()); // Returns 2, etc.
Checking for Element Existence (contains)
To check if a specific element is included in the List, use contains().
if (fruits.contains("grape")) {
System.out.println("grape is present");
}
Summary: List of Frequently Used Basic Operations
| Operation | Method Example | Description |
|---|---|---|
| Addition | add("element") | Adds to the end |
| Retrieval | get(index) | References an element |
| Update | set(index, new element) | Changes the element at the specified position |
| Removal | remove(index/element) | Removes the specified element |
| Get Size | size() | Gets the number of elements |
| Check Existence | contains("element") | Checks if a specific element exists |
4. List Operation Examples
In this chapter, we will introduce practical operation examples using Java’s List. There are many situations where you want to process elements in a list sequentially, and here we will cover representative methods using for loop, enhanced for loop, and Stream API.
Iteration using a for loop
The most basic method is to retrieve elements using an index within a for loop.
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("orange");
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
This method allows for fine-grained control using the index. For example, it is effective when you want to process only elements at even indices.
Iteration using an enhanced for loop (for-each)
If you want to process all elements sequentially without worrying about the index, the enhanced for loop is convenient.
for (String fruit : fruits) {
System.out.println(fruit);
}
The syntax is simple and easy to read, making it one of the most commonly used methods. This is sufficient for simple processing.
Iteration using Lambda Expressions and Stream API
Since Java 8, you can also use the syntax with Stream API and lambda expressions.
fruits.stream().forEach(fruit -> System.out.println(fruit));
The strength of this notation is that multiple processes can be chained together. For example, you can easily filter and then print elements based on specific criteria.
fruits.stream()
.filter(fruit -> fruit.contains("a"))
.forEach(System.out::println);
In this example, it prints only fruits that contain “a”. This is especially recommended for those who want to get used to functional style coding.
Choosing the Right Method
| Method | Advantages | Suitable Situations |
|---|---|---|
| Regular for loop | Allows index control | Processing that requires element numbers |
| Enhanced for loop | Simple and easy to read syntax | Simple iteration processing |
| Stream API | Strong for conditional and chained processing | When combining filtering, mapping, and reduction |
5. Differences and Usage of ArrayList and LinkedList
The representative classes that implement Java’s List interface are ArrayList and LinkedList. Both can be used as List in the same way, but they have differences in internal structure and performance characteristics, so it is important to use them appropriately in the right situations.
Characteristics and Suitable Use Cases of ArrayList
ArrayList internally uses a dynamic array (resizable array).
Main Characteristics:
. Sangat cepat untuk akses acak (berbasis indeks)
Menambahkan elemen di akhir daftar cepat (rata‑rata O(1))
* Penyisipan dan penghapusan di tengah lebih lambat (O(n))
Situasi yang Sesuai:
- Situasi di mana pencarian (
get()) sering terjadi - Situasi di mana jumlah elemen dapat diprediksi sampai batas tertentu sebelumnya
- Pemrosesan di mana penambahan/penghapusan elemen minimal, fokus pada pembacaan
List<String> list = new ArrayList<>();
Karakteristik dan Kasus Penggunaan yang Sesuai untuk LinkedList
LinkedList diimplementasikan dengan struktur daftar berantai ganda.
Karakteristik Utama:
- Cepat untuk menambah dan menghapus elemen (terutama di awal atau akhir)
- Akses acak (
get(index)) lambat (O(n)) - Konsumsi memori sedikit lebih tinggi dibandingkan ArrayList
Situasi yang Sesuai:
- Situasi di mana elemen sering disisipkan atau dihapus (terutama di awal atau di tengah)
- Ketika Anda ingin menggunakannya seperti Queue atau Stack
- Ketika fokus pada iterasi dan akses indeks tidak diperlukan
List<String> list = new LinkedList<>();
Perbandingan Kinerja
Tabel berikut menunjukkan kompleksitas waktu teoretis (notasi Big O) untuk operasi yang umum digunakan.
| Operation | ArrayList | LinkedList |
|---|---|---|
get(int index) | O(1) | O(n) |
add(E e) (at the end) | O(1) | O(1) |
add(int index, E e) | O(n) | O(n) |
remove(int index) | O(n) | O(n) |
| Iteration | O(n) | O(n) |
* Waktu pemrosesan aktual juga dapat dipengaruhi oleh ukuran data, optimasi JVM, dll.

Poin untuk Diferensiasi Penggunaan Praktis
- Jika Anda memperlakukan data sebagai daftar dan mengaksesnya dengan indeks, gunakan ArrayList
- Jika penyisipan/penghapusan di awal atau di tengah sering terjadi, gunakan LinkedList
- Untuk pemrosesan yang sensitif terhadap kinerja, selalu lakukan benchmark dan verifikasi
6. Penggunaan Lanjutan List
Di sini, kami akan memperkenalkan teknik lanjutan untuk menggunakan List Java dengan lebih nyaman. List dapat melakukan berbagai operasi tidak hanya sebagai kumpulan data sederhana tetapi juga melalui pengurutan, pengocokan, penyaringan, transformasi, dll.
Mengurutkan List (Collections.sort)
Dengan menggunakan Collections.sort(), Anda dapat mengurutkan elemen dalam List secara menaik. Elemen harus mengimplementasikan antarmuka Comparable.
import java.util.*;
List<String> fruits = new ArrayList<>();
fruits.add("banana");
fruits.add("apple");
fruits.add("orange");
Collections.sort(fruits);
System.out.println(fruits); // [apple, banana, orange]
Mengurutkan dengan urutan khusus (menggunakan Comparator)
fruits.sort(Comparator.reverseOrder()); // Sorts in descending order
Mengocok List (Collections.shuffle)
Untuk mengacak urutan elemen, Anda dapat menggunakan Collections.shuffle().
Collections.shuffle(fruits);
System.out.println(fruits); // [banana, orange, apple] (example)
Ini berguna ketika Anda menginginkan setumpuk kartu untuk permainan atau urutan tampilan acak.
Menyaring menggunakan Stream API (filter)
Dengan menggunakan Stream sejak Java 8, Anda dapat menulis kode secara ringkas untuk mengekstrak hanya elemen yang memenuhi kondisi.
List<String> filtered = fruits.stream()
.filter(fruit -> fruit.contains("a"))
.collect(Collectors.toList());
System.out.println(filtered); // [apple, banana, orange] (depending on original content and filter)
Transformasi menggunakan Stream API (map)
Untuk mengubah elemen ke format yang berbeda, gunakan map().
List<Integer> lengths = fruits.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths); // Lengths of each fruit name [5, 6, 6] etc.
map() adalah alat yang kuat untuk konversi format data dan pra‑pemrosesan.
Ringkasan Operasi Lanjutan
| Operation | Usage Example | Main Use Cases |
|---|---|---|
| Sort | Collections.sort(list) | Sort in ascending order |
| Shuffle | Collections.shuffle(list) | Randomize the order of elements |
| Filter | stream().filter(...).collect() | Extract only elements that match a condition |
| Transform | stream().map(...).collect() | Transform the type or value of elements |
7. Kesalahan Umum dan Solusinya
Saat bekerja dengan List di Java, salah satu hal yang sering membuat pemula terjebak adalah “eksepsi (kesalahan)”. Di sini, kami akan menjelaskan secara khusus kesalahan representatif yang sering terjadi, penyebabnya, dan cara mengatasinya.
IndexOutOfBoundsException
Penyebab:
Terjadi ketika mencoba mengakses indeks yang tidak ada.
.
List<String> list = new ArrayList<>();
list.add("apple");
System.out.println(list.get(1)); // Error: Index 1 out of bounds
Solusi:
Periksa ukuran sebelum mengakses atau kontrol akses dengan percabangan kondisional untuk memastikan indeks valid.
if (list.size() > 1) {
System.out.println(list.get(1));
}
NullPointerException
Penyebab:
Terjadi ketika memanggil metode pada List atau elemen List yang bernilai null.
List<String> list = null;
list.add("apple"); // NullPointerException occurs
Solusi:
Periksa sebelumnya bahwa variabel tidak null, atau gunakan Optional, dll.
if (list != null) {
list.add("apple");
}
Juga, hati-hati terhadap lupa menginisialisasi:
List<String> list = new ArrayList<>(); // Correct initialization
ConcurrentModificationException
Penyebab:
Terjadi ketika List dimodifikasi secara langsung saat diiterasi menggunakan loop for-each atau Iterator.
for (String fruit : list) {
if (fruit.equals("banana")) {
list.remove(fruit); // ConcurrentModificationException
}
}
Solusi:
Gunakan Iterator untuk menghapus elemen dengan aman, atau gunakan metode seperti removeIf().
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("banana")) {
it.remove(); // Safe removal
}
}
Atau, lebih singkat sejak Java 8 ke atas:
list.removeIf(fruit -> fruit.equals("banana"));
Poin-Poin Lain yang Perlu Diperhatikan
- Memeriksa bahwa List tidak null
- Sangat umum mendeklarasikan variabel tetapi tidak menggunakannya. Inisialisasi sangat penting.
- Memahami bahwa indeks dimulai dari 0
- Pemula sering keliru berpikir “elemen pertama adalah indeks 1”.
Ringkasan Tindakan Pencegahan Kesalahan
| Error Name | Primary Cause | Example Solutions |
|---|---|---|
| IndexOutOfBoundsException | Accessing a non-existent index | Check length with size() |
| NullPointerException | List or element is null | Don’t forget initialization, perform null checks |
| ConcurrentModificationException | Directly modifying the List during iteration | Operate with Iterator or utilize removeIf() |
8. Kesimpulan
Meninjau Dasar-dasar List Java
Pada artikel ini, kami telah menjelaskan dasar hingga aspek lanjutan List di Java secara langkah demi langkah. List khususnya sering digunakan di antara koleksi Java dan merupakan alat penting untuk menangani data secara fleksibel.
Pertama, setelah memahami apa itu List, kami mempelajari poin-poin berikut:
- List adalah koleksi terurut yang memperbolehkan duplikat dan mendukung operasi indeks
- Terdapat kelas implementasi representatif seperti ArrayList dan LinkedList, masing‑masing dengan karakteristik dan kasus penggunaan yang berbeda
- Menguasai operasi dasar (add, get, update, remove, search) memungkinkan manipulasi data yang fleksibel
- Pemrosesan iteratif yang sesuai dengan situasi, seperti for loop, enhanced for loop, dan Stream API
- Mendukung operasi lanjutan seperti penyortiran, penyaringan, dan transformasi
- Memahami kesalahan umum, penyebabnya, dan solusinya membantu mencegah masalah
Membeda-bedakan Penggunaan ArrayList dan LinkedList
Memilih implementasi List yang akan digunakan penting dan harus didasarkan pada isi proses dan jumlah data. Kriteria berikut dapat menjadi panduan:
- ArrayList : Akses acak yang sering, terutama membaca
- LinkedList : Penyisipan/penghapusan yang sering, urutan akses penting
Menuju Pembelajaran di Masa Depan
List hanyalah “titik masuk” ke koleksi Java. Untuk menangani struktur data dan utilitas yang lebih maju, disarankan untuk memperdalam pemahaman Anda tentang kelas dan fitur berikut:
- Set dan Map : Mengelola elemen unik, struktur pasangan kunci-nilai
- Kelas utilitas Collections : Penyortiran, menemukan min/maks, dll.
- Memanfaatkan Stream API : Memperkenalkan pemrograman fungsional
- Memahami Generik : Operasi koleksi yang aman tipe
Menguasai dasar-dasar List akan membuat pemrograman Java Anda secara keseluruhan menjadi jauh lebih mudah dikelola.
Pertanyaan yang Sering Diajukan (FAQ)
Kami telah mengumpulkan poin-poin yang sering ditanyakan pemula tentang List di Java. Kami telah memilih konten yang sering ditemui dalam praktik.
Q1. Apa perbedaan antara List dan Array di Java?
A. Array memiliki jumlah elemen yang tetap dan ukurannya harus ditentukan 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 lebih unggul dalam hal keterbacaan serta pemeliharaan kode.
Q2. Mana yang sebaiknya saya gunakan, ArrayList atau LinkedList?
A. ArrayList cocok terutama ketika ada akses acak yang sering (pengambilan berdasarkan indeks). LinkedList cocok ketika penyisipan dan penghapusan elemen terjadi secara sering. Jika ragu, memulai dengan ArrayList umumnya direkomendasikan.
Q3. Bisakah saya menyimpan tipe primitif (seperti int atau double) dalam sebuah List?
A. Tidak secara langsung. Karena List di Java hanya menangani tipe objek, untuk tipe primitif seperti int Anda harus menggunakan kelas pembungkus yang bersesuaian (Integer, Double, dll.).
List<Integer> numbers = new ArrayList<>();
numbers.add(10); // Auto-boxed and stored as Integer type
Q4. Bagaimana cara saya mengurutkan elemen dalam sebuah List?
A. Anda dapat mengurutkan secara naik menggunakan Collections.sort(list). Juga, jika ingin mengurutkan dengan urutan khusus, Anda dapat menentukan sebuah Comparator untuk pengurutan yang fleksibel.
Q5. Apa yang harus saya lakukan jika ingin mengelola elemen tanpa duplikat?
A. List adalah koleksi yang memperbolehkan duplikat. Jika Anda ingin menghindari duplikat, pertimbangkan menggunakan Set (misalnya HashSet). Namun, perhatikan bahwa urutan tidak dijamin. Jika Anda ingin menghapus duplikat sambil tetap mempertahankan List, pemrosesan Stream berikut juga memungkinkan:
List<String> distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
Q6. Apa yang harus saya lakukan ketika ingin menghapus semua elemen dari sebuah List?
A. Anda dapat menghapus semua elemen dari List menggunakan metode clear().
list.clear();
Q7. Apa saja operasi yang paling sering digunakan pada List?
A. Operasi yang paling sering digunakan dalam praktik adalah add (penambahan), get (pengambilan), remove (penghapusan), dan size (mendapatkan ukuran). Menguasai operasi‑operasi ini akan mencakup sebagian besar pemrosesan dasar.

