Harap pertimbangkan potongan kode di bawah ini:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
akan memberikan 1 karena HashSet
tidak mengizinkan duplikat sehingga hanya satu elemen yang akan disimpan.
Saya ingin tahu apakah kita menambahkan elemen duplikat, lalu apakah itu menggantikan elemen sebelumnya atau tidak menambahkannya?
Juga, apa yang akan terjadi jika menggunakan HashMap
kasus yang sama?
java
hashmap
duplicates
hashset
Anand
sumber
sumber
HashMap
untuk melihat apakahkey
sudah ada sebelum memintaput
dukunganmap
?Set
, dan itu tidak pernah digantikan olehput()
operasi.Set
, tetapi baru menyadari bahwaput()
hanya akan menimpa nilai, bukan kuncinya. Dalam hal ini, nilai yang sama diletakkan di samping kunci lagi, yang mungkin lebih baik atau tidak lebih baik daripada memeriksa apakah kunci ada dan meletakkan. Bagaimanapun, saya mengerti cara kerjanya.HashSet
penerapan dalam bentuk fileHashMap
. Sulit untuk diketahui, kecuali Anda adalah salah satu pengembang kelas.Hal pertama yang perlu Anda ketahui adalah bahwa
HashSet
bertindak seperti aSet
, yang berarti Anda menambahkan objek Anda langsung keHashSet
dan tidak dapat berisi duplikat. Anda cukup menambahkan nilai Anda secara langsungHashSet
.Namun,
HashMap
adalahMap
tipe. Itu berarti setiap kali Anda menambahkan entri, Anda menambahkan pasangan nilai kunci.Dalam
HashMap
Anda dapat memiliki nilai duplikat, tetapi bukan kunci duplikat. DiHashMap
entri baru akan menggantikan yang lama. Entri terbaru akan berada diHashMap
.Memahami Tautan antara HashMap dan HashSet:
Ingat,
HashMap
tidak boleh memiliki kunci duplikat. Di belakang layarHashSet
menggunakan aHashMap
.Saat Anda mencoba menambahkan objek apa pun ke dalam
HashSet
, entri ini sebenarnya disimpan sebagai kunci diHashMap
- samaHashMap
yang digunakan di belakang layarHashSet
. Karena dasar iniHashMap
membutuhkan pasangan nilai kunci, nilai dummy dibuat untuk kita.Sekarang ketika Anda mencoba memasukkan objek duplikat lain ke dalam objek yang sama
HashSet
, itu akan mencoba untuk memasukkannya lagi sebagai kunci diHashMap
bawahnya. Namun,HashMap
tidak mendukung duplikat. Karenanya,HashSet
masih akan menghasilkan hanya satu nilai dari tipe itu. Sebagai catatan tambahan, untuk setiap kunci duplikat, karena nilai yang dihasilkan untuk entri kita di HashSet adalah nilai acak / tiruan, kunci tersebut tidak diganti sama sekali. itu akan diabaikan karena menghapus kunci dan menambahkan kembali kunci yang sama (nilai dummy adalah sama) tidak akan masuk akal sama sekali.Ringkasan:
HashMap
memungkinkan duplikatvalues
, tetapi tidakkeys
.HashSet
tidak boleh berisi duplikat.Untuk bermain dengan apakah penambahan suatu objek berhasil diselesaikan atau tidak, Anda dapat memeriksa
boolean
nilai yang dikembalikan saat Anda memanggil.add()
dan melihat apakah itu kembalitrue
ataufalse
. Jika dikembalikantrue
, itu sudah dimasukkan.sumber
HashMap allows duplicate values
HashMap menggantikan nilai lama dengan yang baru.The docs cukup jelas tentang hal ini:
HashSet.add
tidak mengganti:Tapi akan menggantikan:
HashMap.put
sumber
Ini kasus HashSet, itu TIDAK menggantikannya.
Dari dokumen:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E )
"Menambahkan elemen yang ditentukan ke set ini jika belum ada. Secara formal, menambahkan elemen e yang ditentukan ke set ini jika set ini tidak berisi elemen e2 sehingga (e == null? E2 == null: e.equals ( e2)). Jika set ini sudah berisi elemen, panggilan meninggalkan set tidak berubah dan mengembalikan false. "
sumber
Koreksi saya jika saya salah tetapi yang Anda maksud adalah bahwa dengan string, "Hi" == "Hi" tidak selalu benar (karena mereka belum tentu objek yang sama).
Alasan Anda mendapatkan jawaban 1 adalah karena JVM akan menggunakan kembali objek string jika memungkinkan. Dalam hal ini JVM menggunakan kembali objek string, dan dengan demikian menimpa item tersebut di Hashmap / Hashset.
Tetapi Anda tidak dijamin untuk perilaku ini (karena ini bisa menjadi objek string berbeda yang memiliki nilai "Hi" yang sama). Perilaku yang Anda lihat hanya karena pengoptimalan JVM.
sumber
HashMap
pada dasarnya berisiEntry
yang selanjutnya berisiKey(Object)
dan. SecaraValue(Object)
internalHashSet
adalahHashMap
danHashMap
memang mengganti nilai seperti yang telah Anda tunjuk..tetapi apakah itu benar-benar menggantikan kunci ??? Tidak .. dan itulah triknya di sini.HashMap
mempertahankan nilainya sebagai kunci yang mendasariHashMap
dan nilai hanyalah objek dummy. Jadi jika Anda mencoba memasukkan kembali Nilai yang sama di HashMap (Kunci di Peta yang mendasari). Itu hanya menggantikan nilai dummy dan bukan Kunci (Nilai untuk HashSet).Lihat kode di bawah ini untuk Kelas HashSet:
public boolean [More ...] add(E e) { return map.put(e, PRESENT)==null; }
Di sini e adalah nilai untuk HashSet tetapi kunci untuk peta yang mendasarinya. Dan kunci tidak pernah diganti. Semoga saya bisa menghilangkan kebingungan itu.
sumber
Anda perlu memeriksa metode put di peta Hash terlebih dahulu karena HashSet didukung oleh HashMap
sumber
Untuk mengatakannya secara berbeda: Ketika Anda memasukkan key-value-pair ke dalam HashMap di mana kuncinya sudah ada (dalam arti hashvalue () memberikan nilai yang sama und equal () benar, tetapi kedua objek masih bisa berbeda dalam beberapa cara ), kuncinya tidak diganti tetapi nilainya ditimpa. Kuncinya hanya digunakan untuk mendapatkan hashvalue () dan menemukan nilai dalam tabel dengannya. Karena HashSet menggunakan kunci HashMap dan menetapkan nilai sewenang-wenang yang tidak terlalu penting (bagi pengguna) sebagai akibatnya, Elemen Set juga tidak diganti.
sumber