Perbedaan antara HashSet dan HashMap?


168

Terlepas dari kenyataan yang HashSettidak memungkinkan nilai duplikat, apa perbedaan antara HashMapdan HashSet?

Maksud saya implementasi bijak? Ini agak kabur karena keduanya menggunakan tabel hash untuk menyimpan nilai.


HashSet diimplementasikan menggunakan HashMap
therealprashant

Saya pikir mengetahui mengapa HashSet berbeda dari ArrayList akan membantu Anda memahami jawaban atas pertanyaan Anda di atas: stackoverflow.com/questions/18706870/…
djangofan

Jawaban:


150

Mereka adalah konstruksi yang sama sekali berbeda. A HashMapadalah implementasi dari Map. Sebuah Peta peta kunci untuk nilai-nilai. Pencarian kunci terjadi menggunakan hash.

Di sisi lain, a HashSetadalah implementasi dari Set. Sebuah Set dirancang agar sesuai dengan model matematika dari suatu himpunan. A HashSetmemang menggunakan a HashMapuntuk mendukung implementasinya, seperti yang Anda catat. Namun, ini mengimplementasikan antarmuka yang sama sekali berbeda.

Ketika Anda mencari yang terbaik Collectionuntuk tujuan Anda, Tutorial ini adalah tempat awal yang baik. Jika Anda benar-benar ingin tahu apa yang sedang terjadi, ada buku untuk itu juga.


Pernyataan itu agak sederhana. Ada lagi yang terjadi di bawah selimut, "" Mengembalikan nilai hash untuk objek yang ditentukan. Selain kode hash objek sendiri, metode ini menerapkan "fungsi hash tambahan," yang mempertahankan fungsi hash berkualitas rendah . Ini sangat penting karena HashMap menggunakan kekuatan dari dua tabel hash panjang. " Weblogs.java.net/blog/2005/06/18/hashmap-implementation - namun, jika Anda melihat pada dokumen Anda akan melihat bahwa hash ini mendistribusikan berbagai hal lebih dari "ember", jadi pada akhirnya saya percaya dua hal bisa dipetakan dengan ember yang sama
justkt

1
Untuk menjawab pertanyaan kedua Anda - tidak. Peta adalah jika Anda menginginkan (kunci -> nilai) sebagaimana ditentukan oleh jawaban yang sangat baik dari @Bruno Rothgiesser. Satu set adalah untuk elemen non-duplikat. Jika Anda ingin duplikat dan bukan nilai key->, saya akan memeriksa implementasi java.util.List. Lihatlah tutorial Koleksi untuk panduan yang pasti: java.sun.com/docs/books/tutorial/collections/index.html
justkt

@ justk: ya, Anda bisa mendapatkan dua kunci dalam satu ember, dan kemudian equals () digunakan untuk membedakannya. Itulah mengapa sangat penting bahwa kode hash () dan equals () kompatibel.
Michael Borgwardt

6
@SpikETidE: HashMap atau HashSet tidak memungkinkan duplikat. Itulah intinya.
Michael Borgwardt

23
@SpikETidE: satu set tidak memiliki pasangan kunci / nilai, hanya elemen. Dan HashSet diimplementasikan dengan memiliki HashMap dengan elemen yang ditetapkan sebagai kunci dan nilai diabaikan.
Michael Borgwardt

300

HashSet adalah himpunan , misalnya {1,2,3,4,5}

HashMap adalah peta kunci -> nilai (kunci ke nilai), misalnya {a -> 1, b -> 2, c -> 2, d -> 1}

Perhatikan dalam contoh saya di atas bahwa dalam HashMap tidak boleh ada kunci duplikat, tetapi mungkin memiliki nilai duplikat.

Di HashSet, tidak boleh ada elemen duplikat.


Tapi alasan (paling menarik) untuk kebingungan adalah bahwa bahkan di HashSet Anda memerlukan "kunci" untuk mengakses elemen. Yaitu, objek, bahkan dalam matematika, memiliki nama (atau alamat), jika mereka dapat diakses atau dirujuk. Jadi, dalam arti sebenarnya, HashSet adalah HashMap yang sangat sederhana, diketik dengan nama (atau alamat) elemen-elemennya.
Andrew Marshall

65

HashSet

  1. Kelas HashSet mengimplementasikan antarmuka Set
  2. Di HashSet, kami menyimpan objek (elemen atau nilai) mis. Jika kami memiliki HashSet elemen string maka itu dapat menggambarkan sekumpulan elemen HashSet: {"Halo", "Hai", "Selamat tinggal", "Lari"}
  3. HashSet tidak mengizinkan elemen duplikat yang berarti Anda tidak bisa menyimpan nilai duplikat di HashSet.
  4. HashSet memungkinkan untuk memiliki nilai nol tunggal.
  5. HashSet tidak disinkronkan yang artinya tidak cocok untuk operasi yang aman sebelum kecuali disinkronkan secara eksplisit. [Kesamaan]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

HashMap

  1. Kelas HashMap mengimplementasikan antarmuka Peta
  2. HashMap digunakan untuk menyimpan pasangan kunci & nilai. Singkatnya, ia mempertahankan pemetaan kunci & nilai (Kelas HashMap kira-kira setara dengan Hashtable, kecuali bahwa itu tidak disinkronkan dan memungkinkan nulls.) Ini adalah bagaimana Anda dapat mewakili elemen HashMap jika memiliki kunci integer dan nilai tipe String: misalnya {1 -> ”Halo”, 2 -> ”Hai”, 3 -> ”Sampai jumpa”, 4 -> ”Lari”}
  3. HashMap tidak mengizinkan kunci duplikat namun memungkinkan memiliki nilai duplikat.
  4. HashMap mengizinkan kunci nol tunggal dan sejumlah nilai nol apa pun.
  5. HashMap tidak disinkronkan yang artinya tidak cocok untuk operasi yang aman sebelum kecuali disinkronkan secara eksplisit. [Kesamaan]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

Silakan merujuk artikel ini untuk menemukan informasi lebih lanjut.


36

Sangat memalukan bahwa kedua nama mereka mulai dengan Hash . Itu bagian paling tidak penting dari mereka. Bagian-bagian penting datang setelah Hash - Set dan Peta , seperti yang orang lain tunjukkan. Apa yang mereka, masing-masing, adalah Set - koleksi yang tidak terurut - dan Peta - koleksi dengan akses kunci. Mereka kebetulan diimplementasikan dengan hash - dari situlah nama itu berasal - tetapi esensi mereka tersembunyi di balik bagian nama mereka.

Jangan bingung dengan nama mereka; mereka adalah hal yang sangat berbeda.


@HiteshSahu Keduanya diimplementasikan dengan Hash Tables ( en.wikipedia.org/wiki/Hash_table ). Ini adalah struktur data yang baik untuk mewakili set, efisien dalam cara yang benar, dan, pada dasarnya, kunci HashMap diimplementasikan sebagai HashSet. Jadi siapa pun yang menamai mereka pergi ke masalah untuk mengimplementasikannya dan lebih fokus pada implementasi daripada tujuan mereka (menebak).
Carl Manaster

1
Diterangkan dengan baik. Terima kasih.
user3932000

5

Secara Hashsetinternal mengimplementasikan HashMap. Jika Anda melihat implementasi internal , nilai yang dimasukkan dalam HashSet disimpan sebagai kunci di HashMap dan nilainya adalah objek Dummy dari kelas Object.
Perbedaan antara HashMap vs HashSet adalah: -

  1. HashMap berisi pasangan nilai kunci dan setiap nilai dapat diakses dengan kunci di mana sebagai HashSet perlu diulang setiap kali karena tidak ada metode get.
  2. HashMapmengimplementasikan antarmuka Peta dan memungkinkan satu nilai null sebagai kunci dan beberapa nilai null sebagai nilai. Di mana HashSetmengimplementasikan antarmuka Set, memungkinkan hanya satu nilai nol dan tidak ada nilai duplikat. (Ingat satu kunci nol diizinkan dalam kunci HashMap maka satu nilai nol di HashSet sebagai HashSet mengimplementasikan HashMap secara internal).
  3. HashSetdan HashMaptidak mempertahankan urutan penyisipan saat iterasi.

3

HashSet memungkinkan kita untuk menyimpan objek di set di mana HashMap memungkinkan kita untuk menyimpan objek berdasarkan kunci dan nilai. Setiap objek atau objek yang disimpan akan memiliki kunci.


2

Seperti namanya, HashMap adalah Peta asosiatif (pemetaan dari kunci ke nilai), HashSet hanyalah Set .


2
@SpikETidE Itu detail tentang bagaimana keunikan diimplementasikan, tetapi arti dari HashSet adalah untuk mengimplementasikan suatu set.
Michael Borgwardt

1
jadi .. semuanya bermuara pada "jika Anda tidak ingin duplikat gunakan hashSet ... Jika Anda tidak peduli tentang duplikat gunakan HashMap" ....?
SpikETidE

3
Java tidak menerapkan kelas khusus untuk "koleksi dengan elemen yang berpotensi digandakan" ("tas"), Anda dapat menggunakan Daftar untuk ini (meskipun Daftar menambahkan beberapa semantik ke tas: pesanan; tetapi Anda dapat mengabaikan ini).
leonbloy

2

Perbedaan antara HashSet dan HashMap di Jawa

1) Perbedaan pertama dan paling signifikan antara HashMap dan HashSet adalah bahwa HashMap adalah implementasi dari antarmuka Peta sementara HashSet adalah implementasi dari antarmuka Set, yang berarti HashMap adalah struktur data berbasis nilai kunci dan HashSet menjamin keunikan dengan tidak mengizinkan duplikat. reality HashSet adalah pembungkus di sekitar HashMap di Jawa, jika Anda melihat kode metode add (E e) dari HashSet.java Anda akan melihat kode berikut:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

di mana menempatkan Objek ke peta sebagai kunci dan nilai adalah objek akhir PRESENT yang dummy.

2) Perbedaan kedua antara HashMap dan HashSet adalah bahwa, kami menggunakan metode add () untuk meletakkan elemen ke dalam Set tetapi kami menggunakan metode put () untuk memasukkan kunci dan nilai ke HashMap di Jawa.

3) HashSet hanya memungkinkan satu kunci nol, tetapi HashMap dapat mengizinkan satu kunci nol + beberapa nilai null.

Itu semua perbedaan antara HashSet dan HashMap di Jawa. Singkatnya, HashSet dan HashMap adalah dua jenis Koleksi yang berbeda, Satu diset dan Peta lainnya.


2

Perbedaan antara HashSet dan HashMap di Jawa

HashSet secara internal menggunakan HashMap untuk menyimpan objek.Ketika metode add (String) memanggilnya metode HahsMap put (key, value) di mana key = String object & value = Object baru (Dummy) .jadi ia tidak memelihara duplikat karena kunci tidak lain adalah Value Obyek.

Objek yang disimpan sebagai kunci dalam Hashset / HashMap harus menggantikan kode hash & sama dengan kontrak.

Kunci yang digunakan untuk mengakses / menyimpan objek nilai di HashMap harus dinyatakan sebagai Final karena ketika dimodifikasi, objek Value tidak dapat ditemukan & mengembalikan nol.


1

A HashMapadalah untuk menambah, mendapatkan, menghapus, ... objek yang diindeks oleh kunci khusus jenis apa pun.
A HashSetadalah untuk menambahkan elemen, menghapus elemen dan memeriksa apakah ada elemen dengan membandingkan hash mereka.

Jadi HashMap berisi elemen-elemen dan HashSet mengingat hash mereka.


1
Dengan membandingkan hash mereka dan memanggil equals()metode mereka .
Marquis of Lorne

1

Perbedaan: berkenaan dengan heirarki: HashSet mengimplementasikan Set. HashMap mengimplementasikan Peta dan menyimpan pemetaan kunci dan nilai.

Penggunaan HashSet dan HashMap sehubungan dengan database akan membantu Anda memahami pentingnya masing-masing.
HashSet: umumnya digunakan untuk menyimpan objek koleksi unik. Misalnya: Ini dapat digunakan sebagai kelas implementasi untuk menyimpan hubungan banyak-ke-satu antara
kelas Barang dan Tawaran Kelas di mana (Barang memiliki banyak Tawaran) HashMap: digunakan untuk memetakan kunci ke nilai. Nilainya mungkin nol atau Obyek apa pun / daftar Object (yang merupakan objek itu sendiri).



0

HashSet menggunakan HashMap secara internal untuk menyimpan isinya. Setiap entri dalam HashMap internal dikunci oleh Objek tunggal, sehingga semua entri hash ke dalam ember yang sama. Saya tidak ingat apa yang digunakan HashMap internal untuk menyimpan nilai-nilainya, tetapi itu tidak terlalu penting karena wadah internal itu tidak akan pernah mengandung nilai duplikat.

EDIT : Untuk menanggapi komentar Matthew, dia benar; Saya memilikinya mundur. HashMap internal dikunci dengan Objects yang membentuk elemen Set . Nilai-nilai HashMap adalah Obyek yang hanya disimpan dalam ember HashMap.


Itu tidak benar. Elemen set langsung digunakan sebagai kunci HashMap.
Matthew Flaschen

0

HashMapadalah Mapimplementasi, yang memungkinkan nilai duplikat tetapi bukan kunci duplikat. . Untuk menambahkan objek, pasangan Kunci / Nilai diperlukan. Nilai Null Keys dan Null diizinkan. misalnya:

{The-> 3, world-> 5, is-> 2, nice-> 4}

HashSetadalah Setimplementasi, yang tidak memungkinkan duplikat . Jika Anda mencoba menambahkan objek duplikat, panggilan ke public boolean add(Object o)metode, maka set tetap tidak berubah dan kembali false. misalnya:

[Dunia, ini, bagus]


-1

Anda cukup banyak menjawab pertanyaan Anda sendiri - hashset tidak mengizinkan nilai duplikat. akan sepele untuk membangun hashset menggunakan hashmap backing (dan hanya memeriksa untuk melihat apakah nilai sudah ada). Saya kira berbagai implementasi java melakukan itu, atau mengimplementasikan beberapa kode kustom untuk melakukannya lebih efisien.


1
@oedo - java.util.HashSetmengatakan bahwa ini didukung oleh java.util.HashMap.
justkt

2
Tidak mengizinkan duplikat tidak ada perbedaan di antara mereka.
Marquis of Lorne

-1

Pada dasarnya di HashMap, pengguna harus memberikan Key dan Value, sedangkan di HashSet Anda hanya memberikan Value, Key diturunkan secara otomatis dari Value dengan menggunakan fungsi hash. Jadi setelah memiliki Key dan Value, HashSet dapat disimpan sebagai HashMap secara internal.


Kuncinya adalah nilai dalam HashSet.
Marquis of Lorne

-1

HashSet dan HashMap keduanya menyimpan pasangan, perbedaannya terletak pada HashMap Anda dapat menentukan kunci sementara di HashSet kuncinya berasal dari kode hash objek


Jika itu benar, HashSet tidak bisa menyimpan beberapa objek dengan kode hash yang sama, dan itu benar.
Marquis of Lorne

-1

HashMapsizinkan satu kunci nol dan nilai nol. Mereka tidak disinkronkan, yang meningkatkan efisiensi. Jika diperlukan, Anda dapat membuatnya disinkronkan menggunakanCollections.SynchronizedMap()

Hashtables jangan izinkan kunci nol dan disinkronkan.


Dia tidak bertanya tentang Hashtables. Tidak menjawab pertanyaan.
Marquis of Lorne

-2

HashMap adalah implementasi dari antarmuka Peta HashSet adalah implementasi dari Set Interface

HashMap Menyimpan data dalam bentuk pasangan nilai kunci HashSet hanya menyimpan objek

Metode put digunakan untuk menambahkan elemen di peta. Tambahkan metode yang digunakan untuk menambahkan elemen adalah Set

Dalam peta hash, nilai kode hash dihitung menggunakan objek kunci. Di sini objek anggota digunakan untuk menghitung nilai kode hash yang dapat sama untuk dua objek, jadi metode yang sama () digunakan untuk memeriksa kesetaraan jika mengembalikan false yang berarti dua objek berbeda.

HashMap lebih cepat daripada hashset karena kunci unik digunakan untuk mengakses objek HashSet lebih lambat dari Hashmap


1
Mereka pada dasarnya memiliki kinerja yang identik, dan 'karena kunci unik digunakan' salah.
Marquis of Lorne
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.