Saya mencoba mencari tahu kapan dan mengapa menggunakan Kamus atau HashTable. Saya telah melakukan sedikit pencarian di sini dan telah menemukan orang-orang berbicara tentang kelebihan generik dari Kamus yang saya sepenuhnya setujui, yang mengarahkan keuntungan tinju dan unboxing untuk sedikit peningkatan kinerja.
Tetapi saya juga telah membaca Kamus tidak akan selalu mengembalikan objek dalam urutan yang dimasukkan, hal itu diurutkan. Di mana sebagai HashTable akan. Seperti yang saya pahami ini mengarah ke HashTable yang jauh lebih cepat untuk beberapa situasi.
Pertanyaan saya sebenarnya, seperti apa situasi itu? Apakah saya salah dalam asumsi saya di atas? Situasi apa yang mungkin Anda gunakan untuk memilih satu di atas yang lain, (ya yang terakhir agak ambigu).
Jawaban:
System.Collections.Generic.Dictionary<TKey, TValue>
danSystem.Collections.Hashtable
kelas keduanya mempertahankan struktur data tabel hash secara internal. Tak satu pun dari mereka yang menjamin menjaga urutan barang.Mengesampingkan masalah tinju / unboxing, sebagian besar waktu, mereka harus memiliki kinerja yang sangat mirip.
Perbedaan struktural utama di antara mereka adalah bahwa
Dictionary
bergantung pada rantai (menjaga daftar item untuk setiap kotak hash table) untuk menyelesaikan tabrakan sedangkanHashtable
menggunakan rehashing untuk resolusi tabrakan (ketika tabrakan terjadi, mencoba fungsi hash lain untuk memetakan kunci ke ember) .Ada sedikit manfaat menggunakan
Hashtable
kelas jika Anda menargetkan untuk .NET Framework 2.0+. Ini secara efektif dianggap usang olehDictionary<TKey, TValue>
.sumber
Hashtable
. Tabel hash menyimpan 3 buah informasi dalam entri: hash kunci, kunci itu sendiri, dan nilai. Untuk item dengan hash yang sama, harus melintasi daftar untuk menemukan item dengan kunci yang sama dan mengembalikan nilainya. Ini juga cukup benarHashtable
. Sebagai pengembang menggunakanDictionary
normal, Anda tidak perlu khawatir tentang hal itu.Saya kira itu tidak berarti apa-apa bagi Anda sekarang. Tapi hanya untuk referensi bagi orang yang mampir
Uji Kinerja - SortedList vs. SortedDictionary vs. Kamus vs. Hashtable
Alokasi memori:
Waktu yang digunakan untuk memasukkan:
Waktu untuk mencari item:
sumber
Perbedaan antara Hashtable dan Kamus
Kamus:
Hashtable:
sumber
Perbedaan penting lainnya adalah bahwa tipe Hashtable mendukung banyak pembaca bebas kunci dan satu penulis pada saat yang sama, sedangkan Kamus tidak.
sumber
Tautan: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
sumber
Keduanya secara efektif adalah kelas yang sama (Anda dapat melihat pembongkaran). HashTable dibuat terlebih dahulu sebelum .Net memiliki obat generik. Kamus, bagaimanapun, adalah kelas generik dan memberi Anda manfaat mengetik yang kuat. Saya tidak akan pernah menggunakan HashTable karena Kamus tidak memberi biaya apa pun untuk Anda gunakan.
sumber
Perbedaan penting lainnya
Hashtable
adalah benang aman.Hashtable
telah dibangun di beberapa pembaca / penulis tunggal (MR / SW) keselamatan benang yang berartiHashtable
memungkinkan SATU penulis bersama dengan banyak pembaca tanpa mengunci. Dalam halDictionary
tidak ada keamanan ulir, jika Anda membutuhkan pengaman ulir Anda harus menerapkan sinkronisasi Anda sendiri.Untuk menguraikan lebih lanjut:
sumber
Kamus memiliki keuntungan menjadi tipe generik, yang membuatnya menjadi tipe yang aman dan sedikit lebih cepat karena kurangnya kebutuhan untuk tinju. Tabel perbandingan berikut (dibangun menggunakan jawaban yang ditemukan di pos pertanyaan SO serupa ) menggambarkan beberapa alasan lain yang mendukung kamus lebih dari tabel hash (atau sebaliknya).
sumber
Jika Anda ingin membaca yang akan selalu mengembalikan objek sesuai urutannya yang dimasukkan ke dalam Kamus, Anda dapat melihatnya
OrderedDictionary - nilai dapat diakses melalui indeks integer (berdasarkan urutan penambahan item) SortedDictionary - item diurutkan secara otomatis
sumber
Kamus lebih cepat daripada hashtable karena kamus adalah tipe kuat umum. Hashtable lebih lambat karena mengambil objek sebagai tipe data yang mengarah ke tinju dan unboxing.
sumber