Menu

HashSet Java: Nilai Unik, Keanggotaan, dan Operasi Set

Cara memakai HashSet di Java untuk kumpulan nilai unik: add, contains, remove, menghapus duplikat dari list, dan menggabungkan set dengan union, intersection, dan difference.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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:

  • LinkedHashSet menjaga urutan saat data dimasukkan, yaitu urutan kamu menambahkan elemen.
  • TreeSet menjaga elemen tetap terurut berdasarkan urutan alaminya (atau Comparator yang 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai