Pertanyaan Mengapa Kamus lebih disukai daripada Hashtable?


Dalam sebagian besar bahasa pemrograman, kamus lebih disukai daripada hashtables. Apa alasan di balik itu?


1203
2017-11-19 09:24


asal


Jawaban:


Untuk apa nilainya, sebuah Kamus aku s (Secara konseptual) tabel hash.

Jika Anda bermaksud "mengapa kita menggunakan Dictionary<TKey, TValue> kelas bukan Hashtable kelas? ", maka itu adalah jawaban yang mudah: Dictionary<TKey, TValue> adalah tipe generik, Hashtable tidak. Itu berarti Anda mendapatkan jenis keamanan dengan Dictionary<TKey, TValue>, karena Anda tidak dapat memasukkan objek acak ke dalamnya, dan Anda tidak perlu membuang nilai yang Anda keluarkan.

Menariknya, itu Dictionary<TKey, TValue> implementasi dalam .NET Framework didasarkan pada Hashtable, seperti yang Anda tahu dari komentar ini dalam kode sumbernya:

Kamus generik disalin dari sumber Hashtable

Sumber 


1405
2017-11-19 09:28



Dictionary <<< >>> Hashtable perbedaan:

  • Umum  <<< >>> Non-Generik
  • Kebutuhan sinkronisasi utas sendiri <<< >>> Penawaran utas aman versi melalui Synchronized() metode
  • Item yang dicacah: KeyValuePair <<< >>> Item yang disebutkan: DictionaryEntry
  • Baru (> .NET 2.0) <<< >>> Lebih lama (sejak .NET 1.0)
  • dalam System.Collections.Generic <<< >>> dalam System.Collections 
  • Permintaan untuk kunci yang tidak ada melempar pengecualian <<< >>> Permintaan untuk kunci yang tidak ada mengembalikan null
  • berpotensi sedikit lebih cepat untuk jenis nilai <<< >>> sedikit lebih lambat (kebutuhan tinju / unboxing) untuk jenis nilai

Dictionary / Hashtable kesamaan:

  • Keduanya secara internal hashtables == akses cepat ke banyak data berdasarkan kunci
  • Keduanya membutuhkan kunci abadi dan unik
  • Kunci keduanya membutuhkan sendiri GetHashCode() metode

Serupa .NET collections (kandidat untuk digunakan sebagai ganti Dictionary dan Hashtable):

  • ConcurrentDictionary - utas aman (dapat diakses dengan aman dari beberapa utas secara bersamaan)
  • HybridDictionary - kinerja yang optimal (untuk beberapa item dan juga untuk banyak item)
  • OrderedDictionary - nilai bisa diakses melalui indeks int (dengan urutan di mana barang ditambahkan)
  • SortedDictionary - item disortir secara otomatis
  • StringDictionary - sangat diketik dan dioptimalkan untuk string

564
2018-04-21 10:32



Karena Dictionary adalah kelas generik ( Dictionary<TKey, TValue> ), sehingga mengakses kontennya adalah jenis-aman (yaitu Anda tidak perlu membuang dari Object, seperti yang Anda lakukan dengan Hashtable).

Membandingkan

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

untuk

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

Namun, Dictionary diimplementasikan sebagai Hashtable di dalam, jadi secara teknis itu bekerja dengan cara yang sama.


163
2017-11-19 09:27



FYI: Di .NET, Hashtable adalah utas aman untuk digunakan oleh beberapa utas pembaca dan satu utas penulisan, sementara di Dictionary anggota statis publik aman utas, tetapi anggota instance mana pun tidak dijamin aman.

Kami harus mengubah semua kamus kami kembali Hashtable karena ini.


80
2017-11-19 11:55



Di. NET, perbedaan antara Dictionary<,> dan HashTable adalah bahwa yang pertama adalah tipe generik, sehingga Anda mendapatkan semua manfaat dari generik dalam hal pemeriksaan tipe statis (dan mengurangi tinju, tetapi ini tidak sebesar orang yang cenderung berpikir dalam hal kinerja - ada yang pasti biaya memori ke tinju, meskipun).


62
2017-11-19 09:28



Orang-orang mengatakan bahwa Kamus adalah sama dengan tabel hash.

Ini belum tentu benar. Sebuah tabel hash adalah sebuah pelaksanaan kamus. Yang khas pada saat itu, dan mungkin yang baku di .NET, tetapi bukan hanya definisi satu-satunya.

Anda juga bisa menerapkan kamus dengan daftar tertaut atau pohon pencarian, itu tidak akan seefisien (untuk beberapa metrik efisien).


27
2017-11-19 13:03



Collections & Generics berguna untuk menangani sekelompok objek. Di .NET, semua objek koleksi berada di bawah antarmuka IEnumerable, yang pada gilirannya memiliki ArrayList(Index-Value)) & HashTable(Key-Value). Setelah .NET framework 2.0, ArrayList & HashTable diganti dengan List & Dictionary. Sekarang, itu Arraylist & HashTable tidak lagi digunakan dalam proyek-proyek saat ini.

Datang ke perbedaan antara HashTable & Dictionary, Dictionary adalah generik dimana Hastable bukan Generik. Kita dapat menambahkan jenis objek apa pun HashTable, tetapi saat mengambil, kita perlu mentransmisikannya ke tipe yang diperlukan. Jadi, itu bukan tipe aman. Tapi untuk dictionary, sementara mendeklarasikan dirinya sendiri kita dapat menentukan jenis kunci dan nilai, jadi tidak perlu membuang saat mengambil.

Mari kita lihat sebuah contoh:

HashTable

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

Kamus,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

21
2017-09-17 11:10



Kamus:

  • Ini mengembalikan / melempar Pengecualian jika kami mencoba menemukan kunci yang tidak ada.

  • Ini lebih cepat daripada Hashtable karena tidak ada tinju dan unboxing.

  • Hanya anggota statis publik yang aman.

  • Kamus adalah tipe umum yang berarti kita dapat menggunakannya dengan tipe data apa pun (Saat membuat, harus menentukan tipe data untuk kunci dan nilai).

    Contoh: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • Kamus adalah implementasi aman jenis Hashtable, Keys dan Values sangat diketik.

Hashtable:

  • Ia mengembalikan null jika kita mencoba untuk menemukan kunci yang tidak ada.

  • Lebih lambat dari kamus karena membutuhkan tinju dan unboxing.

  • Semua anggota dalam Hashtable aman,

  • Hashtable bukan tipe generik,

  • Hashtable adalah struktur data yang diketik secara longgar, kita dapat menambahkan kunci dan nilai dari jenis apa pun.


14
2018-05-28 07:53



Sejak .NET Framework 3.5 ada juga a HashSet<T> yang menyediakan semua kelebihan Dictionary<TKey, TValue> jika Anda hanya memerlukan kunci dan tidak ada nilai.

Jadi jika Anda menggunakan Dictionary<MyType, object> dan selalu atur nilainya null untuk mensimulasikan tipe tabel hash yang aman, Anda mungkin harus mempertimbangkan untuk beralih ke HashSet<T>.


14
2018-01-15 10:29



Itu Pemeriksaan Ekstensif Struktur Data Menggunakan C # artikel di MSDN menyatakan bahwa ada juga perbedaan dalam strategi resolusi tabrakan:

Kelas Hashtable menggunakan teknik yang disebut sebagai mengulangi.

Rehashing berfungsi sebagai berikut: ada seperangkat fungsi hash yang berbeda,   H1 ... Hn, dan saat memasukkan atau mengambil item dari hash   meja, awalnya H1 fungsi hash digunakan. Jika ini mengarah ke   tabrakan, H2 dicoba sebagai gantinya, dan seterusnya hingga Hn jika diperlukan.

Kamus menggunakan teknik yang disebut sebagai chaining.

Dengan rehashing, jika terjadi tabrakan, hash dikomputasi ulang, dan slot baru yang sesuai dengan hash dicoba. Dengan chaining, bagaimanapun, struktur data sekunder digunakan untuk memegang   tabrakan apa pun. Secara khusus, setiap slot dalam Kamus memiliki larik   elemen yang memetakan ke keranjang itu. Jika terjadi tabrakan, maka   elemen bertabrakan ditambahkan ke daftar ember.


12
2017-10-29 11:12