List #
Dalam Java, List adalah salah satu antarmuka (interface) dalam koleksi framework yang mewakili urutan elemen yang dapat diakses berdasarkan indeks mereka. List memungkinkan penyimpanan elemen-elemen duplikat dan memberikan kontrol penuh atas elemen-elemen tersebut melalui berbagai operasi. Ada beberapa implementasi dari antarmuka List yang populer digunakan, masing-masing dengan karakteristik dan performa yang berbeda.
ArrayList
#
ArrayList
adalah implementasi dari antarmuka List
yang didasarkan pada array yang dapat berubah ukurannya. Ini adalah pilihan yang bagus ketika Anda memerlukan operasi akses elemen yang cepat dan tidak terlalu sering menambahkan atau menghapus elemen dari tengah list.
Operasi Dasar #
-
Membuat
ArrayList
List<String> list = new ArrayList<>();
-
Menambahkan Elemen
list.add("A"); list.add("B"); list.add("C");
-
Mengakses Elemen Berdasarkan Indeks
String elemenPertama = list.get(0); // Mengakses elemen pertama
-
Mengganti Elemen di Indeks Tertentu
list.set(1, "D"); // Mengganti elemen kedua dengan "D"
-
Menghapus Elemen Berdasarkan Indeks atau Nilai
list.remove(0); // Menghapus elemen pertama list.remove("C"); // Menghapus elemen dengan nilai "C"
-
Mendapatkan Ukuran List
int ukuran = list.size();
-
Memeriksa Apakah List Mengandung Elemen Tertentu
boolean adaElemenB = list.contains("B");
-
Iterasi Melalui List
for (String elemen : list) { System.out.println(elemen); }
Karakteristik ArrayList
:
- Akses Elemen Cepat: Akses elemen berdasarkan indeks sangat cepat (O(1)).
- Penambahan dan Penghapusan Lambat di Tengah: Menambahkan atau menghapus elemen di tengah list relatif lambat (O(n)) karena elemen-elemen berikutnya perlu dipindahkan.
LinkedList
#
LinkedList
adalah implementasi dari antarmuka List
yang didasarkan pada struktur data linked list. Setiap elemen dalam linked list berisi referensi ke elemen berikutnya (dan sebelumnya dalam kasus linked list ganda). LinkedList
adalah pilihan yang baik ketika Anda sering menambahkan atau menghapus elemen dari awal atau tengah list.
Operasi Dasar #
-
Membuat
LinkedList
List<String> linkedList = new LinkedList<>();
-
Menambahkan Elemen
linkedList.add("X"); linkedList.add("Y"); linkedList.add("Z");
-
Mengakses Elemen Berdasarkan Indeks
String elemenPertama = linkedList.get(0);
-
Menambahkan Elemen di Awal atau Akhir
linkedList.addFirst("A"); // Menambahkan di awal linkedList.addLast("B"); // Menambahkan di akhir
-
Menghapus Elemen dari Awal atau Akhir
linkedList.removeFirst(); // Menghapus elemen pertama linkedList.removeLast(); // Menghapus elemen terakhir
-
Iterasi Melalui List
for (String elemen : linkedList) { System.out.println(elemen); }
Karakteristik LinkedList
:
- Akses Elemen Lebih Lambat: Mengakses elemen berdasarkan indeks lebih lambat (O(n)) dibandingkan
ArrayList
. - Penambahan dan Penghapusan Cepat: Menambahkan atau menghapus elemen di awal atau tengah list lebih cepat (O(1) untuk operasi di awal atau akhir).
Vector
#
Vector
adalah implementasi dari List
yang mirip dengan ArrayList
, tetapi bersifat thread-safe, artinya operasi pada Vector
aman digunakan dalam lingkungan multithreading karena metode-metodenya disinkronkan.
Operasi Dasar #
-
Membuat
Vector
List<String> vector = new Vector<>();
-
Menambahkan Elemen
vector.add("1"); vector.add("2"); vector.add("3");
-
Mengakses Elemen Berdasarkan Indeks
String elemenPertama = vector.get(0);
-
Menghapus Elemen
vector.remove(1);
Karakteristik Vector
:
- Thread-Safe: Metode-metode
Vector
disinkronkan, sehingga aman digunakan di lingkungan multithreading. - Lebih Lambat: Karena penyinkronan,
Vector
umumnya lebih lambat dibandingkanArrayList
.
Stack
#
Stack
adalah subclass dari Vector
yang mengikuti prinsip LIFO (Last In, First Out). Ini berarti elemen terakhir yang dimasukkan ke dalam stack adalah elemen pertama yang diambil.
Operasi Dasar #
-
Membuat
Stack
Stack<String> stack = new Stack<>();
-
Menambahkan Elemen ke Stack (Push)
stack.push("A"); stack.push("B"); stack.push("C");
-
Menghapus dan Mengembalikan Elemen Teratas (Pop)
String elemenTeratas = stack.pop();
-
Melihat Elemen Teratas Tanpa Menghapusnya (Peek)
String elemenTeratas = stack.peek();
-
Memeriksa Apakah Stack Kosong
boolean isEmpty = stack.isEmpty();
Karakteristik Stack
:
- LIFO: Elemen yang terakhir dimasukkan adalah elemen pertama yang diambil.
- Penggunaan Umum: Stack digunakan dalam banyak algoritma, seperti penelusuran depth-first search (DFS), undo operation dalam aplikasi, dan lain-lain.
CopyOnWriteArrayList
#
CopyOnWriteArrayList
adalah versi thread-safe dari ArrayList
yang digunakan dalam situasi di mana list lebih sering dibaca daripada diubah. Saat terjadi perubahan, list lama tetap tidak berubah, dan perubahan dilakukan pada salinan baru dari list.
Operasi Dasar #
-
Membuat
CopyOnWriteArrayList
List<String> cowList = new CopyOnWriteArrayList<>();
-
Menambahkan Elemen
cowList.add("1"); cowList.add("2");
-
Iterasi Melalui List (Thread-Safe)
for (String elemen : cowList) { System.out.println(elemen); }
Karakteristik CopyOnWriteArrayList
:
- Thread-Safe: Iterasi aman dalam lingkungan multithreading tanpa perlu sinkronisasi eksternal.
- Efisiensi dalam Membaca: Efisien untuk operasi baca (read) yang sering, tetapi tidak ideal untuk operasi tulis (write) yang sering.
Kesimpulan #
Java menyediakan beberapa implementasi List
, masing-masing dengan karakteristik dan kegunaan spesifik:
ArrayList
: Cocok untuk operasi akses elemen yang cepat, tetapi kurang efisien untuk penambahan atau penghapusan elemen di tengah list.LinkedList
: Ideal untuk penambahan dan penghapusan elemen di awal atau tengah list, tetapi akses elemen berdasarkan indeks lebih lambat.Vector
: Mirip denganArrayList
, tetapi thread-safe.Stack
: Mengikuti prinsip LIFO dan merupakan subclass dariVector
.CopyOnWriteArrayList
: Thread-safe dan ideal untuk situasi di mana operasi baca jauh lebih sering daripada operasi tulis.
Dengan memahami karakteristik masing-masing implementasi List
, Anda dapat memilih struktur data yang paling sesuai untuk kebutuhan spesifik aplikasi Anda.