Set Menyimpan Nilai Unik
HashSet (dari java.util) adalah collection yang menyimpan setiap nilai paling banyak satu kali. Tidak ada key dan value yang dipasangkan seperti di HashMap, hanya sekumpulan elemen yang berbeda-beda. Tugas utamanya adalah menjawab satu pertanyaan dengan cepat: "apakah benda ini ada di sini?"
Ada satu type parameter, <ElementType>. Sama seperti ArrayList dan HashMap, biasanya variabelnya diberi tipe interface Set, lalu yang dibuat adalah HashSet.
add Memberi Tahu Apakah Nilainya Baru
add tidak hanya menyimpan nilai: ia mengembalikan boolean yang memberi tahu apakah set-nya benar-benar berubah. Menambahkan nilai yang sudah ada akan mengembalikan false dan membiarkan set-nya tidak tersentuh.
Nilai return itu sangat berguna: if (!seen.add(x)) { /* x is a repeat */ } memungkinkanmu mendeteksi duplikat dalam satu baris sambil berjalan.
Menghapus Duplikat dari List
Karena set menolak nilai yang berulang, cara tercepat untuk membuang duplikat dari sebuah collection adalah memasukkannya ke dalam set. Constructor HashSet menerima collection lain apa pun:
Inilah alasan paling umum pemula memakai set. Ketahui saja bahwa urutan aslinya hilang dalam proses bolak-balik ini. Pakai LinkedHashSet kalau urutan itu penting (dibahas di bawah).
contains, remove, dan size
Operasi sehari-harinya mirip dengan collection lain:
Keunggulan besarnya dibanding ArrayList ada pada contains. List harus menelusuri setiap elemen untuk menjawabnya (O(n)), sedangkan HashSet hampir langsung melompat ke jawabannya (kira-kira O(1)). Kalau kamu mendapati dirimu memanggil list.contains(...) di dalam loop, biasanya itu tanda untuk beralih ke set.
Operasi Set: Union, Intersection, Difference
Set paling bersinar saat digabungkan. Method-method ini mudah dibaca begitu kamu tahu mana yang mana:
Jebakan utamanya: addAll, retainAll, dan removeAll mengubah set tempat method itu dipanggil. Itulah sebabnya setiap contoh menyalin a ke HashSet baru terlebih dahulu; kalau tidak, set aslimu akan rusak. Buat set baru untuk setiap hasil.
HashSet Tidak Menjaga Urutan
Seperti HashMap, HashSet tidak menjanjikan urutan iterasi apa pun, dan urutannya bisa berbeda di antara satu eksekusi dan eksekusi berikutnya. Kalau kamu butuh urutan yang bisa diprediksi:
LinkedHashSetmenjaga urutan saat data dimasukkan, yaitu urutan kamu menambahkan elemen.TreeSetmenjaga elemen tetap terurut berdasarkan urutan alaminya (atauComparatoryang kamu berikan).
Ketiganya mengimplementasikan interface Set, jadi menukar salah satunya cukup dengan mengubah satu baris di constructor.
Elemen Harus Bisa Di-hash
Di balik layar, HashSet didukung oleh HashMap, jadi aturan yang sama berlaku: ia menemukan elemen dengan melakukan hashing, artinya hashCode() dan equals() milik sebuah elemen harus selaras. Tipe bawaan seperti String dan Integer sudah melakukannya dengan benar, itulah sebabnya string "java" yang duplikat di atas tergabung dengan benar. Kalau kamu menyimpan instance dari class buatanmu sendiri, override equals dan hashCode sekaligus. Kalau tidak, dua objek yang maknanya "sama" akan dianggap berbeda, dan contains serta penghapusan duplikat akan gagal tanpa pemberitahuan.
Berikutnya: Iterasi Collection
Sekarang kamu sudah mengenal tiga collection andalan: ArrayList, HashMap, dan HashSet. Cara menelusuri masing-masing sedikit berbeda, dan ada jebakan yang halus (seperti mengubah collection saat sedang menelusurinya). Berikutnya kita akan merangkum semuanya dan membahas cara menelusuri collection dengan rapi memakai for-each loop, iterator, dan forEach.
Pertanyaan yang sering diajukan
Bagaimana cara membuat HashSet di Java?
Deklarasikan dengan satu type parameter, yaitu tipe elemennya, lalu panggil constructor-nya: Set<String> tags = new HashSet<>();. Tambahkan nilai dengan tags.add("java"); dan periksa keanggotaannya dengan tags.contains("java");. Import java.util.HashSet dan java.util.Set.
Apa perbedaan HashSet dan ArrayList di Java?
ArrayList menyimpan setiap elemen yang kamu tambahkan (termasuk duplikat) sesuai urutan saat dimasukkan, dan diakses berdasarkan posisi. HashSet hanya menyimpan nilai unik, tidak menjanjikan urutan apa pun, tidak punya index, dan pemeriksaan contains-nya berjalan dalam waktu yang kira-kira konstan, bukan dengan memindai seluruh list. Pakai HashSet saat kamu peduli pada keunikan atau pemeriksaan keanggotaan yang cepat, bukan pada posisi.
Bagaimana cara menghapus duplikat dari list di Java?
Berikan list itu ke constructor HashSet: Set<String> unique = new HashSet<>(list);. Set itu otomatis membuang nilai yang berulang. Kalau kamu butuh list lagi (dan tidak keberatan urutannya hilang), bungkus lagi: new ArrayList<>(unique). Pakai LinkedHashSet kalau kamu ingin urutan aslinya tetap terjaga.