Collections & Generics
ArrayList, HashMap, HashSet, iterasi koleksi, generics, wrapper type, Comparable/Comparator, dan memilih struktur data.
Mengapa Collections?
Array berukuran tetap. Di dunia nyata datanya bertambah dan berkurang. Java Collections Framework (paket java.util) menyediakan struktur data siap pakai yang ukurannya fleksibel.
| Interface | Implementasi umum | Ciri |
|---|---|---|
List | ArrayList, LinkedList | berurutan, boleh duplikat, akses lewat indeks |
Set | HashSet, TreeSet | tanpa duplikat |
Map | HashMap, TreeMap | pasangan kunci → nilai |
Queue/Deque | ArrayDeque, PriorityQueue | antrean / tumpukan |
Generics
Generics menambahkan tipe isi koleksi di dalam tanda < >. Compiler lalu menjamin hanya tipe itu yang masuk, tanpa casting.
List<String> nama = new ArrayList<>(); // <> = diamond, tipe ditebak
nama.add("Sari");
// nama.add(42); // ERROR saat kompilasi, bukan saat jalan
Generics hanya menerima tipe referensi, bukan primitif. Gunakan wrapper: Integer, Double, Boolean, Character, Long. Konversi primitif ↔ wrapper terjadi otomatis (autoboxing).
ArrayList
import java.util.ArrayList;
import java.util.List;
List<String> buah = new ArrayList<>();
buah.add("Apel");
buah.add("Jeruk");
buah.add(0, "Mangga"); // sisip di indeks 0
System.out.println(buah.get(1)); // Apel
System.out.println(buah.size()); // 3
buah.remove("Jeruk");
buah.set(0, "Pisang");
System.out.println(buah.contains("Apel")); // true
for (String b : buah) System.out.println(b);
List<String> tetap = List.of("a", "b"); // immutable
HashMap
import java.util.HashMap;
import java.util.Map;
Map<String, Integer> stok = new HashMap<>();
stok.put("pensil", 10);
stok.put("buku", 5);
stok.put("pensil", 12); // menimpa nilai lama
System.out.println(stok.get("pensil")); // 12
System.out.println(stok.getOrDefault("pulpen", 0)); // 0
stok.merge("buku", 1, Integer::sum); // buku jadi 6
for (Map.Entry<String, Integer> e : stok.entrySet()) {
System.out.println(e.getKey() + " = " + e.getValue());
}
stok.containsKey("buku"); // true
stok.remove("pensil");
Kunci harus unik. Urutan iterasi HashMap tidak dijamin; pakai LinkedHashMap (urutan sisip) atau TreeMap (urut kunci) jika perlu.
HashSet
Set<String> unik = new HashSet<>(List.of("a", "b", "a"));
System.out.println(unik.size()); // 2 (duplikat hilang)
Mengurutkan
List<Integer> angka = new ArrayList<>(List.of(5, 2, 9));
Collections.sort(angka); // [2, 5, 9]
angka.sort(Comparator.reverseOrder()); // [9, 5, 2]
List<Mahasiswa> ms = ...;
ms.sort(Comparator.comparing(Mahasiswa::getNama));
Objek buatanmu bisa punya urutan alami dengan mengimplementasikan Comparable<T> (method compareTo), atau urutan khusus lewat Comparator.
Membuat class generik sendiri
class Kotak<T> {
private T isi;
public void simpan(T isi) { this.isi = isi; }
public T ambil() { return isi; }
}
Kotak<String> k = new Kotak<>();
k.simpan("halo");
Jebakan umum
ConcurrentModificationExceptionjika menghapus elemen saat menelusuri dengan enhanced for. GunakanremoveIf(...)atauIterator.- Membandingkan wrapper dengan
==: gunakanequals. - Menggunakan objek sebagai kunci
HashMap/isiHashSettanpa meng-overrideequalsdanhashCode(record melakukannya otomatis).
Memilih struktur data
| Kebutuhan | Pilih |
|---|---|
| Daftar berurutan, akses cepat via indeks | ArrayList |
| Cari nilai dari kunci | HashMap |
| Hilangkan duplikat / cek keanggotaan | HashSet |
| Antrean FIFO / tumpukan LIFO | ArrayDeque |