Pertanyaan Perbedaan antara HashMap dan Hashtable?


Apa perbedaan antara a HashMap dan a Hashtable di Jawa?

Mana yang lebih efisien untuk aplikasi tanpa utas?


3113
2017-09-02 20:12


asal


Jawaban:


Ada beberapa perbedaan antara HashMap dan Hashtable di Java:

  1. Hashtable aku s disinkronkan, sedangkan HashMap tidak. Ini membuat HashMap lebih baik untuk aplikasi non-berulir, karena Objek yang tidak tersinkronisasi biasanya berfungsi lebih baik daripada yang tersinkronisasi.

  2. Hashtable tidak mengizinkan null kunci atau nilai. HashMap memungkinkan satu null kunci dan sejumlah null nilai-nilai.

  3. Salah satu subclass HashMap adalah LinkedHashMap, jadi jika Anda ingin urutan iterasi yang dapat diprediksi (yang merupakan urutan penyisipan secara default), Anda dapat dengan mudah menukar HashMap untuk sebuah LinkedHashMap. Ini tidak akan mudah jika Anda menggunakan Hashtable.

Karena sinkronisasi bukan masalah bagi Anda, saya akan merekomendasikan HashMap. Jika sinkronisasi menjadi masalah, Anda juga dapat melihat ConcurrentHashMap.


3203
2017-09-02 23:02



Perhatikan, bahwa banyak jawaban menyatakan bahwa Hashtable disinkronkan. Dalam praktik ini, Anda hanya membeli sedikit.  Sinkronisasi pada metode accessor / mutator akan menghentikan dua utas menambahkan atau menghapus dari peta secara bersamaan, tetapi di dunia nyata Anda akan sering membutuhkan sinkronisasi tambahan.

Sebuah idiom yang sangat umum adalah "memeriksa lalu taruh" - yaitu mencari entri di Peta, dan menambahkannya jika belum ada. Ini sama sekali bukan operasi atom apakah Anda menggunakan Hashtable atau HashMap.

HashMap yang diselaraskan setara dapat diperoleh dengan:

Collections.synchronizedMap(myMap);

Tetapi untuk benar menerapkan logika ini yang Anda butuhkan sinkronisasi tambahan dari bentuk:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Bahkan iterasi atas entri Hashtable (atau HashMap yang diperoleh oleh Collections.synchronizedMap) tidak aman dari benang kecuali Anda juga menjaga Map agar tidak dimodifikasi melalui sinkronisasi tambahan.

Implementasi dari ConcurrentMap antarmuka (misalnya ConcurrentHashMap) memecahkan beberapa hal ini dengan memasukkan thread safe check-then-act semantik seperti:

ConcurrentMap.putIfAbsent(key, value);

580
2017-09-03 11:00



Tidak ada yang menyebutkan fakta itu Hashtable aku s tidak bagian dari Java Collections Framework - itu hanya menyediakan API yang serupa. Juga, Hashtable dianggap sebagai kode warisan. Tidak ada apa-apa Hashtable yang tidak bisa dilakukan menggunakan HashMap atau derivasi dari HashMap, jadi untuk kode baru, saya tidak melihat alasan untuk kembali Hashtable.


287
2018-06-25 01:46



Pertanyaan ini sering ditanyakan dalam wawancara untuk memeriksa apakah kandidat memahami penggunaan kelas pengumpulan yang benar dan menyadari solusi alternatif yang tersedia.

  1. Kelas HashMap secara kasar setara dengan Hashtable, kecuali bahwa ia tidak disinkronkan dan memungkinkan null. (HashMap memungkinkan nilai nol sebagai kunci dan nilai sedangkan Hashtable tidak mengizinkan nol).
  2. HashMap tidak menjamin bahwa urutan peta akan tetap konstan dari waktu ke waktu.
  3. HashMap tidak disinkronkan sedangkan Hashtable disinkronkan.
  4. Iterator di HashMap gagal-aman sementara enumerator untuk Hashtable tidak dan membuang ConcurrentModificationException jika ada Thread lain memodifikasi peta secara struktural dengan menambahkan atau menghapus elemen apa pun kecuali metode Iterator's remove (). Tapi ini bukan perilaku yang dijamin dan akan dilakukan oleh JVM pada upaya terbaik.

Catatan tentang Beberapa Istilah Penting

  1. Disinkronkan berarti hanya satu utas yang dapat memodifikasi tabel hash pada satu titik waktu. Pada dasarnya, itu berarti bahwa setiap thread sebelum melakukan pembaruan pada hashtable harus mendapatkan kunci pada objek sementara yang lain akan menunggu kunci dilepaskan.
  2. Fail-safe relevan dari konteks iterator. Jika iterator telah dibuat pada objek koleksi dan beberapa untaian lainnya mencoba memodifikasi objek koleksi "secara struktural", pengecualian modifikasi bersamaan akan dilemparkan. Mungkin untuk thread lain meskipun untuk memanggil "set" metode karena tidak memodifikasi koleksi "secara struktural". Namun, jika sebelum memanggil "set", koleksi telah dimodifikasi secara struktural, "IllegalArgumentException" akan dibuang.
  3. Modifikasi struktural berarti menghapus atau memasukkan elemen yang secara efektif dapat mengubah struktur peta.

HashMap dapat disinkronkan oleh

Map m = Collections.synchronizeMap(hashMap);

Peta menyediakan tampilan Koleksi alih-alih dukungan langsung untuk iterasi  melalui objek Pencacahan. Tampilan koleksi sangat meningkatkan  ekspresif antarmuka, seperti yang dibahas nanti di bagian ini.  Peta memungkinkan Anda untuk mengulangi kunci, nilai, atau pasangan nilai-kunci;  Hashtable tidak menyediakan opsi ketiga. Peta menyediakan cara yang aman  untuk menghapus entri di tengah-tengah iterasi; Hashtable tidak.  Akhirnya, Peta memperbaiki kekurangan kecil di antarmuka Hashtable.  Hashtable memiliki metode yang disebut berisi, yang mengembalikan true jika  Hashtable mengandung nilai yang diberikan. Mengingat namanya, Anda mengharapkan ini  metode untuk mengembalikan true jika Hashtable berisi kunci yang diberikan, karena  kuncinya adalah mekanisme akses utama untuk Hashtable. Peta  antarmuka menghilangkan sumber kebingungan ini dengan mengganti nama metode  containsValue. Juga, ini meningkatkan konsistensi antarmuka -  containsValue parallels containsKey.

Antarmuka Peta


148
2017-10-04 06:39



HashMap: Implementasi dari Map antarmuka yang menggunakan kode hash untuk mengindeks array. Hashtable: Hai, 1998 disebut. Mereka ingin API koleksi mereka kembali.

Serius meskipun, Anda lebih baik tinggal jauh dari Hashtable sama sekali. Untuk aplikasi single-threaded, Anda tidak perlu overhead tambahan sinkronisasi. Untuk aplikasi yang sangat bersamaan, sinkronisasi paranoid dapat menyebabkan kelaparan, deadlock, atau pengumpulan sampah yang tidak perlu dijeda. Seperti yang ditunjukkan Tim Howland, mungkin Anda gunakan ConcurrentHashMap sebagai gantinya.


107
2017-09-02 23:14



Ingat itu HashTable adalah kelas warisan sebelum Java Collections Framework (JCF) diperkenalkan dan kemudian dipasang untuk mengimplementasikan Map antarmuka. Begitu juga Vector dan Stack.

Oleh karena itu, selalu menjauh dari mereka dalam kode baru karena selalu ada alternatif yang lebih baik di JCFseperti yang ditunjukkan orang lain.

Ini dia Cheat koleksi Java yang akan berguna bagi Anda. Perhatikan blok abu-abu berisi kelas warisan HashTable, Vector, dan Stack.

enter image description here


104
2018-03-25 08:58



Selain apa yang dikatakan izb, HashMap memungkinkan nilai nol, sedangkan Hashtable tidak.

Juga perhatikan itu Hashtable meluas Dictionary kelas, yang sebagai Javadocs negara, sudah usang dan telah digantikan oleh Map antarmuka.


58
2017-09-02 20:30



Lihatlah bagan ini. Ini menyediakan perbandingan antara struktur data yang berbeda bersama dengan HashMap dan Hashtable. Perbandingannya tepat, jelas dan mudah dimengerti.

Matriks Koleksi Java


50
2017-11-20 05:35



Hashtable mirip dengan HashMap dan memiliki antarmuka serupa. Disarankan agar Anda menggunakannya HashMap, kecuali Anda memerlukan dukungan untuk aplikasi warisan atau Anda perlu sinkronisasi, seperti Hashtables metode disinkronkan. Jadi dalam kasus Anda karena Anda tidak multi-threading, HashMaps adalah taruhan terbaik Anda.


39
2017-09-02 20:25



Perbedaan utama lain antara hashtable dan hashmap adalah bahwa Iterator dalam HashMap gagal-cepat sementara enumerator untuk HashMap tidak dan membuang ConcurrentModificationException jika ada Thread lain memodifikasi peta secara struktural dengan menambahkan atau menghapus elemen apa pun kecuali metode Iterator's remove (). Tapi ini bukan perilaku yang dijamin dan akan dilakukan oleh JVM pada upaya terbaik. "

Sumber saya: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


31
2017-09-08 06:40