Jika saya lulus kunci yang sama beberapa kali untuk HashMap
's put
metode, apa yang terjadi pada nilai asli? Dan bagaimana jika bahkan nilainya berulang? Saya tidak menemukan dokumentasi tentang ini.
Kasus 1: Nilai yang ditimpa untuk kunci
Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","not one");
mymap.put("1","surely not one");
System.out.println(mymap.get("1"));
Kami mendapatkan surely not one
.
Kasus 2: Nilai rangkap
Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","not one");
mymap.put("1","surely not one");
// The following line was added:
mymap.put("1","one");
System.out.println(mymap.get("1"));
Kami mendapatkan one
.
Tetapi apa yang terjadi pada nilai-nilai lainnya? Saya mengajarkan dasar-dasar kepada seorang siswa dan saya ditanyai hal ini. Apakah Map
ember seperti tempat nilai terakhir direferensikan (tetapi dalam memori)?
Jawaban:
Menurut definisi,
put
perintah ini menggantikan nilai sebelumnya yang terkait dengan kunci yang diberikan di peta (secara konseptual seperti operasi pengindeksan array untuk tipe primitif).Peta hanya menjatuhkan referensi ke nilai. Jika tidak ada yang memegang referensi ke objek, objek itu menjadi memenuhi syarat untuk pengumpulan sampah. Selain itu, Java mengembalikan nilai sebelumnya yang terkait dengan kunci yang diberikan (atau
null
jika tidak ada), sehingga Anda dapat menentukan apa yang ada di sana dan menyimpan referensi jika perlu.Informasi lebih lanjut di sini: HashMap Doc
sumber
Anda dapat menemukan jawaban Anda di javadoc Peta # put (K, V) (yang sebenarnya mengembalikan sesuatu):
Jadi jika Anda tidak menetapkan nilai yang dikembalikan saat menelepon
mymap.put("1", "a string")
, itu hanya menjadi tidak direferensikan dan dengan demikian memenuhi syarat untuk pengumpulan sampah.sumber
null
) seperti yang didokumentasikan tepat di atas di javadoc jadi, ya, inilah yang saya maksud. Bisakah itu benar-benar disalahartikan?Nilai sebelumnya untuk kunci dijatuhkan dan diganti dengan yang baru.
Jika Anda ingin menyimpan semua nilai yang diberikan kunci, Anda dapat mempertimbangkan untuk mengimplementasikan sesuatu seperti ini:
sumber
itu fitur Kunci / Nilai dan Anda tidak dapat memiliki kunci duplikat untuk beberapa nilai karena ketika Anda ingin mendapatkan nilai aktual yang salah satu dari nilai-nilai itu dimasukkan ke
dalam kunci yang dimasukkan dalam contoh Anda saat Anda ingin mendapatkan nilai "1" yang mana Itu ?!
itulah alasan untuk memiliki kunci unik untuk setiap nilai tetapi Anda dapat memiliki trik dengan lib standar java:
dan Anda bisa menggunakannya dengan cara ini:
dan hasil cetak adalah:
sumber
Mengaitkan nilai yang ditentukan dengan kunci yang ditentukan di peta ini. Jika peta sebelumnya berisi pemetaan untuk kunci, nilai lama diganti.
sumber
Ini menggantikan nilai yang ada di peta untuk kunci masing-masing. Dan jika tidak ada kunci dengan nama yang sama maka itu menciptakan kunci dengan nilai yang diberikan. misalnya:
Tombol OUTPUT = "1", nilai = "dua"
Jadi, nilai sebelumnya akan ditimpa.
sumber
Untuk pertanyaan Anda apakah peta itu seperti ember: tidak.
Ini seperti daftar dengan
name=value
pasangan sedangkanname
tidak perlu menjadi String (bisa, meskipun).Untuk mendapatkan elemen, Anda meneruskan kunci Anda ke get () - metode yang memberi Anda objek yang ditugaskan sebagai imbalan.
Dan peta Hash berarti bahwa jika Anda mencoba untuk mengambil objek Anda menggunakan metode get, itu tidak akan membandingkan objek nyata dengan yang Anda berikan, karena itu perlu mengulangi melalui daftar dan membandingkan () kunci Anda memberikan elemen saat ini.
Ini tidak efisien. Alih-alih, apa pun objek Anda, ia menghitung kode hash yang disebut dari kedua objek dan membandingkannya. Lebih mudah membandingkan dua objek
int
daripada dua objek keseluruhan (mungkin sangat kompleks). Anda dapat membayangkan kode hash seperti ringkasan yang memiliki panjang (int) yang telah ditentukan, karena itu tidak unik dan memiliki tabrakan. Anda menemukan aturan untuk kode hash dalam dokumentasi yang saya masukkan tautannya.Jika Anda ingin tahu lebih banyak tentang ini, Anda mungkin ingin melihat artikel di javapractices.com dan technofundo.com
salam
sumber
Saya selalu menggunakan:
jika saya ingin menerapkan banyak hal pada satu kunci pengidentifikasi.
Anda selalu bisa melakukan sesuatu seperti ini dan membuat diri Anda labirin!
sumber
Peta dari JDK tidak dimaksudkan untuk menyimpan data di bawah kunci duplikat.
Paling-paling nilai baru akan menimpa yang sebelumnya.
Skenario yang lebih buruk adalah pengecualian (misalnya ketika Anda mencoba mengumpulkannya sebagai aliran):
Tidak ada duplikat:
Stream.of("one").collect(Collectors.toMap(x -> x, x -> x))
Aliran duplikat:
Stream.of("one", "not one", "surely not one").collect(Collectors.toMap(x -> 1, x -> x))
Untuk menangani kunci duplikat - gunakan paket lain, misalnya: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html
Ada banyak implementasi lain yang berhubungan dengan kunci duplikat. Itu diperlukan untuk web (mis. Kunci cookie duplikat, header Http dapat memiliki bidang yang sama, ...)
Semoga berhasil! :)
sumber
Collectors.toMap()
memiliki argumen ketiga - fungsi gabungan. Jika kita ingin hanya menimpa terakhir duplikat elemen:Stream.of("one", "two", "one").collect(Collectors.toMap(x -> x, x -> x, (key1, key2) -> key2))
. link"one", "not one", "surely not one"
tidak akan menghasilkan kesalahan kunci duplikat karena semua string berbeda.BTW, jika Anda ingin beberapa semantik seperti hanya memasukkan jika kunci ini tidak ada. Anda dapat menggunakannya
concurrentHashMap
denganputIfAbsent()
fungsi. Lihat ini:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html#put(K,%20V)
concurrentHashMap
thread aman dengan kinerja tinggi karena menggunakan mekanisme " penguncian strip " untuk meningkatkan throughput.sumber
Ya, ini berarti semua kunci 1 dengan nilai ditimpa dengan nilai tambah terakhir dan di sini Anda menambahkan "pasti bukan satu" sehingga hanya akan menampilkan "pasti bukan satu".
Sekalipun Anda mencoba menampilkan dengan satu lingkaran, itu juga hanya akan menampilkan satu kunci dan nilai yang memiliki kunci yang sama.
sumber
Berarti peta hash tidak akan memungkinkan duplikat, jika Anda telah benar ditimpa sama dengan metode hashCode ().
HashSet juga menggunakan HashMap secara internal, lihat dokumen sumber
sumber