Collections & Generics

ArrayList, HashMap, HashSet, iterasi koleksi, generics, wrapper type, Comparable/Comparator, dan memilih struktur data.

Part 11 dari 17 ± 60 menit Gratis

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.

InterfaceImplementasi umumCiri
ListArrayList, LinkedListberurutan, boleh duplikat, akses lewat indeks
SetHashSet, TreeSettanpa duplikat
MapHashMap, TreeMappasangan kunci → nilai
Queue/DequeArrayDeque, PriorityQueueantrean / 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

  • ConcurrentModificationException jika menghapus elemen saat menelusuri dengan enhanced for. Gunakan removeIf(...) atau Iterator.
  • Membandingkan wrapper dengan ==: gunakan equals.
  • Menggunakan objek sebagai kunci HashMap/isi HashSet tanpa meng-override equals dan hashCode (record melakukannya otomatis).

Memilih struktur data

KebutuhanPilih
Daftar berurutan, akses cepat via indeksArrayList
Cari nilai dari kunciHashMap
Hilangkan duplikat / cek keanggotaanHashSet
Antrean FIFO / tumpukan LIFOArrayDeque

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X