Perbedaan Antara HashMap dan Hashtable

1. Ikhtisar

Dalam tutorial singkat ini, kita akan fokus pada perbedaan inti antara Hashtable dan HashMap .

2. Hashtable dan HashMap di Java

Hashtable dan HashMap sangat mirip - keduanya adalah koleksi yang menerapkan antarmuka Peta .

Selain itu, metode put () , get () , remove () , dan containsKey () menyediakan kinerja waktu-konstan O (1). Secara internal, metode ini bekerja berdasarkan konsep umum hashing menggunakan bucket untuk menyimpan data.

Tidak ada kelas yang mempertahankan urutan penyisipan elemen. Dengan kata lain, item pertama yang ditambahkan mungkin bukan item pertama saat kita mengulang nilainya.

Tetapi mereka juga memiliki beberapa perbedaan yang membuat satu lebih baik dari yang lain dalam beberapa situasi. Mari kita lihat lebih dekat perbedaan ini.

3. Perbedaan Antara Hashtable dan HashMap

3.1. Sinkronisasi

Pertama, Hashtable aman untuk utas dan dapat dibagikan di antara beberapa utas dalam aplikasi.

Di sisi lain, HashMap tidak disinkronkan dan tidak dapat diakses oleh banyak utas tanpa kode sinkronisasi tambahan. Kita bisa menggunakan Collections.synchronizedMap () untuk membuat versi thread-safe dari HashMap . Kami juga dapat membuat kode kunci khusus atau membuat kode aman untuk thread dengan menggunakan kata kunci tersinkron .

HashMap tidak disinkronkan, oleh karena itu lebih cepat dan menggunakan lebih sedikit memori daripada Hashtable . Umumnya, objek yang tidak disinkronkan lebih cepat daripada objek yang disinkronkan dalam aplikasi berulir tunggal.

3.2. Nilai Null

Perbedaan lainnya adalah penanganan null . HashMap memungkinkan menambahkan satu Entri dengan null sebagai kunci serta banyak entri dengan nilai null . Sebaliknya, Hashtable tidak mengizinkan nol sama sekali . Mari kita 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());

Selanjutnya, mari kita lihat bagaimana Hashtable berbeda:

Hashtable table = new Hashtable(); table.put("key", null);

Ini menghasilkan NullPointerException . Menambahkan objek dengan null sebagai kunci juga menghasilkan NullPointerException :

table.put(null, "value");

3.3. Iterasi Atas Elemen

HashMap menggunakan Iterator untuk mengulang nilai, sedangkan Hashtable memiliki Enumerator yang sama. The Iterator merupakan penerus dari Enumerator yang menghilangkan beberapa kekurangan. Misalnya, Iterator memiliki metode remove () untuk menghapus elemen dari koleksi yang mendasari.

The Iterator adalah iterator gagal-cepat. Dengan kata lain, ini melontarkan ConcurrentModificationException saat koleksi yang mendasarinya diubah saat melakukan iterasi. Mari kita lihat contoh gagal-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 memunculkan pengecualian ConcurrentModificationException karena kita memanggil put () saat melakukan iterasi pada koleksi.

4. Kapan Memilih HashMap Selama Hashtable

Kita harus menggunakan HashMap untuk aplikasi yang tidak tersinkronisasi atau berulir tunggal.

Perlu disebutkan bahwa sejak JDK 1.8, Hashtable sudah tidak digunakan lagi. Namun, ConcurrentHashMap adalah pengganti Hashtable yang bagus . Kita harus mempertimbangkan ConcurrentHashMap untuk digunakan dalam aplikasi dengan banyak utas.

5. Kesimpulan

Dalam artikel ini, kami mengilustrasikan perbedaan antara HashMap dan Hashtable dan apa yang harus diingat saat kami harus memilih satu.

Seperti biasa, penerapan semua contoh dan cuplikan kode ini selesai di Github.