Apakah memeriksa keberadaan kunci di HashMap selalu diperlukan?
Saya memiliki HashMap dengan mengatakan 1000 entri dan saya sedang mencari cara untuk meningkatkan efisiensi. Jika HashMap sedang diakses sangat sering, maka memeriksa keberadaan kunci di setiap akses akan menghasilkan overhead yang besar. Alih-alih jika kunci tidak ada dan karenanya pengecualian terjadi, saya bisa menangkap pengecualian. (ketika saya tahu bahwa ini akan jarang terjadi). Ini akan mengurangi akses ke HashMap hingga setengahnya.
Ini mungkin bukan praktik pemrograman yang baik, tetapi ini akan membantu saya mengurangi jumlah akses. Atau apakah saya melewatkan sesuatu di sini?
[ Pembaruan ] Saya tidak memiliki nilai nol di HashMap.
Jawaban:
Apakah Anda pernah menyimpan nilai nol? Jika tidak, Anda bisa melakukannya:
Jika tidak, Anda bisa memeriksa keberadaannya jika Anda mendapatkan nilai nol yang dikembalikan:
sumber
get
baik-baik saja, dan jangan melakukan dua pencarian saat Anda membutuhkannya juga.if(value!=null || map.containsKey(key))
untuk bagian kedua. Setidaknya jika Anda ingin melakukan hal yang sama - tidak ada kode yang diulang. Ini akan bekerja karena korsleting .Anda tidak akan mendapatkan apa-apa dengan memeriksa apakah kuncinya ada. Ini adalah kode dari
HashMap
:Cukup periksa apakah nilai pengembalian
get()
berbedanull
.Ini adalah kode sumber HashMap.
Sumber:
Kode sumber HashMapsalahsumber
Cara yang lebih baik adalah dengan menggunakan
containsKey
metodeHashMap
. Besok seseorang akan menambahkan null ke Peta. Anda harus membedakan antara keberadaan kunci dan kunci memiliki nilai nol.sumber
null
.Maksud Anda kode seperti itu
seluruh tempat ? Maka Anda cukup memeriksa apakah
map.get(key)
dikembalikan nol dan hanya itu. Omong-omong, HashMap tidak melempar pengecualian untuk kunci yang hilang, melainkan mengembalikan null. Satu-satunya kasus di manacontainsKey
diperlukan adalah ketika Anda menyimpan nilai nol, untuk membedakan antara nilai nol dan nilai yang hilang, tetapi ini biasanya dianggap praktik buruk.sumber
Cukup gunakan
containsKey()
untuk kejelasan. Cepat dan menjaga kode tetap bersih dan mudah dibaca. Inti dariHashMap
s adalah bahwa pencarian kunci cepat, pastikanhashCode()
danequals()
diterapkan dengan benar.sumber
sumber
Anda juga dapat menggunakan
computeIfAbsent()
metode diHashMap
kelas.Dalam contoh berikut,
map
menyimpan daftar transaksi (bilangan bulat) yang diterapkan pada kunci (nama rekening bank). Untuk menambahkan 2 transaksi dari100
dan200
kechecking_account
Anda dapat menulis:Dengan cara ini Anda tidak perlu memeriksa untuk melihat apakah kunci itu
checking_account
ada atau tidak.computeIfAbsent()
.Sangat elegan! 👍
sumber
Saya biasanya menggunakan idiom
Ini berarti Anda hanya menekan peta dua kali jika kuncinya hilang
sumber
sumber
Jawaban Jon Skeet membahas dengan baik dua skenario (peta dengan
null
nilai dan bukannull
nilai) dengan cara yang efisien.Tentang entri angka dan masalah efisiensi, saya ingin menambahkan sesuatu.
Peta dengan 1.000 entri bukan peta besar.
Serta peta dengan 5.000 atau 10.000 entri.
Map
dirancang untuk melakukan pengambilan cepat dengan dimensi seperti itu.Sekarang, diasumsikan bahwa
hashCode()
kunci peta menyediakan distribusi yang baik.Jika Anda dapat menggunakan
Integer
jenis kunci sebagai, lakukan.Its
hashCode()
metode ini sangat efisien karena tabrakan tidak mungkin untuk unikint
nilai-nilai:Jika untuk kuncinya, Anda harus menggunakan tipe bawaan lain seperti
String
misalnya yang sering digunakanMap
, Anda mungkin memiliki beberapa tabrakan tetapi dari 1.000 hingga ribuan objek diMap
dalamnya, Anda harus memilikinya sangat sedikit sebagaiString.hashCode()
metode memberikan distribusi yang baik.Jika Anda menggunakan jenis khusus, timpa
hashCode()
danequals()
dengan benar dan pastikan keseluruhan yanghashCode()
menyediakan distribusi yang adil.Anda dapat merujuk ke item 9 dari
Java Effective
merujuknya.Inilah pos yang merinci caranya.
sumber