1. Gambaran keseluruhan
Dalam tutorial ringkas ini, kita akan menumpukan pada perbezaan inti antara Hashtable dan HashMap .
2. Hashtable dan HashMap di Java
Hashtable dan HashMap agak serupa - kedua-duanya adalah koleksi yang melaksanakan antara muka Peta .
Juga, kaedah put () , get () , remove () , and mengandungKey () memberikan prestasi masa tetap O (1). Secara dalaman, kaedah ini berfungsi berdasarkan konsep umum hashing menggunakan baldi untuk menyimpan data.
Kedua-dua kelas tidak mengekalkan susunan unsur. Dengan kata lain, item pertama yang ditambahkan mungkin bukan item pertama ketika kita mengulang nilai.
Tetapi mereka juga mempunyai beberapa perbezaan yang menjadikan seseorang lebih baik daripada yang lain dalam beberapa situasi. Mari lihat lebih dekat perbezaan ini.
3. Perbezaan Antara Hashtable dan HashMap
3.1. Penyegerakan
Pertama, Hashtable selamat digunakan pada benang dan boleh dikongsi antara beberapa utas dalam aplikasi.
Sebaliknya, HashMap tidak diselaraskan dan tidak dapat diakses oleh beberapa utas tanpa kod penyegerakan tambahan. Kita boleh menggunakan Collections.synchronizedMap () untuk membuat versi HashMap yang selamat untuk thread . Kita juga boleh membuat kod kunci tersuai atau menjadikan utas kod itu selamat dengan menggunakan kata kunci yang disegerakkan .
HashMap tidak diselaraskan, oleh itu ia lebih pantas dan menggunakan memori yang lebih sedikit daripada Hashtable . Secara amnya, objek yang tidak disegerakkan lebih cepat daripada objek yang disegerakkan dalam aplikasi berulir tunggal.
3.2. Nilai Batal
Perbezaan lain adalah pengendalian nol . HashMap membolehkan menambahkan satu Entri dengan kunci null dan juga banyak entri dengan nilai null sebagai. Sebaliknya, Hashtable tidak membenarkan null sama sekali . Mari lihat contoh null dan HashMap :
HashMap map = new HashMap(); map.put(null, "value"); map.put("key1", null); map.put("key2", null);
Ini akan menghasilkan:
assertEquals(3, map.size());
Seterusnya, mari kita lihat bagaimana Hashtable berbeza:
Hashtable table = new Hashtable(); table.put("key", null);
Ini menghasilkan NullPointerException . Menambah objek dengan null sebagai kunci juga menghasilkan NullPointerException :
table.put(null, "value");
3.3. Pengulangan Terhadap Elemen
HashMap menggunakan Iterator untuk mengulang nilai, sedangkan Hashtable mempunyai Enumerator untuk nilai yang sama. The Pelelar ialah pengganti Pembanci yang menghapuskan beberapa kelemahannya. Sebagai contoh, Iterator mempunyai kaedah remove () untuk membuang elemen dari koleksi yang mendasari.
The Pelelar ialah iterator gagal pantas. Dengan kata lain, ia melancarkan ConcurrentModificationException apabila koleksi asasnya diubah semasa melakukan lelaran. Mari lihat contoh kegagalan cepat:
HashMap map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); Iterator iterator = map.keySet().iterator(); while(iterator.hasNext()){ iterator.next(); map.put("key4", "value4"); }
Ini membuang pengecualian ConcurrentModificationException kerana kita memanggil put () semasa berulang pada koleksi.
4. Bila Memilih HashMap Over Hashtable
Kita harus menggunakan HashMap untuk aplikasi yang tidak disegerakkan atau berulir tunggal.
Perlu dinyatakan bahawa sejak JDK 1.8, Hashtable sudah tidak digunakan lagi. Walau bagaimanapun, ConcurrentHashMap adalah pengganti Hashtable yang hebat . Kita harus mempertimbangkan ConcurrentHashMap untuk digunakan dalam aplikasi dengan pelbagai utas.
5. Kesimpulan
Dalam artikel ini, kami menggambarkan perbezaan antara HashMap dan Hashtable dan apa yang perlu diingat ketika kita perlu memilihnya.
Seperti biasa, pelaksanaan semua contoh dan coretan kod ini selesai di Github.