Map Menyimpan Pasangan Key-Value
HashMap (dari java.util) menyimpan pasangan: setiap key dipetakan ke satu value, dan kamu mencari value berdasarkan key-nya dalam waktu yang kira-kira konstan. Bayangkan sebuah kamus: kata adalah key-nya, definisinya adalah value-nya.
Dua type parameter-nya adalah <KeyType, ValueType>. Di sini key-nya String dan value-nya Integer. Sama seperti ArrayList, biasanya variabelnya diberi tipe interface Map, lalu yang dibuat adalah HashMap.
put, get, dan Menimpa Nilai
Dua hal yang perlu kamu pahami betul:
- Key itu unik.
putdengan key yang sudah ada mengganti value-nya dan mengembalikan value yang lama. getpada key yang tidak ada mengembalikannull, bukan error. Auto-unboxingnullitu menjadiintmelemparNullPointerException, yang sering menjadi sumber bug.
getOrDefault Menghindari Jebakan Null
Daripada memeriksa null setiap saat, mintalah nilai cadangan:
Ini cara paling rapi untuk menangani pencarian yang "mungkin ada", dan cara ini langsung membawa kita ke pola HashMap yang paling terkenal.
Menghitung Kemunculan
Menghitung berapa kali setiap item muncul adalah tugas khas HashMap:
Pola map.put(key, map.getOrDefault(key, 0) + 1) bisa dibaca sebagai "ambil hitungan saat ini (atau nol), tambah satu, simpan kembali". Versi yang lebih ringkas dengan hasil yang sama adalah counts.merge(word, 1, Integer::sum).
Memeriksa dan Menghapus
putIfAbsent(key, value) hanya menulis kalau key-nya belum ada, berguna untuk inisialisasi yang ditunda (lazy initialization).
Perulangan pada HashMap
Loop yang paling umum menelusuri entrySet(), yang memberimu setiap key dan value sekaligus:
Kalau kamu hanya butuh key-nya saja atau value-nya saja:
Kamu juga bisa memakai forEach dengan lambda: ages.forEach((name, age) -> System.out.println(name + ": " + age));.
HashMap Tidak Menjaga Urutan
HashMap tidak menjanjikan urutan iterasi apa pun: urutannya tergantung hasil hashing, dan bisa berubah di antara satu eksekusi dan eksekusi berikutnya. Kalau kamu butuh urutan yang bisa diprediksi:
LinkedHashMapmenjaga urutan saat data dimasukkan.TreeMapmenjaga key tetap terurut berdasarkan urutan alaminya (atauComparatoryang kamu berikan).
Ketiganya mengimplementasikan interface Map, jadi menggantinya cukup dengan mengubah satu baris di constructor.
Key Harus Bisa Di-hash
HashMap menemukan entry dengan melakukan hashing pada key, jadi hashCode() dan equals() milik sebuah key harus selaras. Tipe bawaan seperti String dan Integer sudah melakukannya dengan benar. Kalau kamu memakai class buatanmu sendiri sebagai key, override equals dan hashCode sekaligus. Kalau tidak, dua objek yang maknanya "sama" akan masuk ke bucket yang berbeda dan pencarianmu akan gagal secara misterius.
Berikutnya: HashSet
HashMap menjawab pertanyaan "value apa yang disimpan di bawah key ini?". Kalau kamu hanya peduli apakah sesuatu ada atau tidak, yaitu sekumpulan nilai unik tanpa data terkait, alat yang tepat adalah HashSet, yang dibahas berikutnya.
Pertanyaan yang sering diajukan
Bagaimana cara membuat HashMap di Java?
Deklarasikan dengan dua type parameter, yaitu tipe key dan tipe value, lalu panggil constructor-nya: Map<String, Integer> ages = new HashMap<>();. Setelah itu tambahkan entry dengan ages.put("Ada", 36); dan baca dengan ages.get("Ada");. Import java.util.HashMap dan java.util.Map.
Bagaimana cara melakukan perulangan pada HashMap di Java?
Telusuri map.entrySet() dengan for-each loop untuk mendapatkan setiap key dan value sekaligus: for (Map.Entry<String, Integer> e : map.entrySet()) { ... }, lalu baca e.getKey() dan e.getValue(). Kamu juga bisa menelusuri map.keySet() untuk key saja atau map.values() untuk value saja. Perhatikan bahwa HashMap tidak menjaga urutan saat data dimasukkan.
Apa perbedaan get dan getOrDefault?
get(key) mengembalikan value untuk sebuah key, atau null kalau key-nya tidak ada. Ini bisa memicu NullPointerException kalau hasilnya langsung kamu pakai. getOrDefault(key, fallback) mengembalikan value kalau ada, kalau tidak mengembalikan nilai cadangan yang kamu berikan, jadi kamu tidak perlu memeriksa null. Ini sangat praktis untuk menghitung: counts.put(c, counts.getOrDefault(c, 0) + 1).