Java集合面試題(03) Java中HashMap和HashTable之間區別

劉近光發表於2017-11-21

宣告:本文為本博主翻譯,未經允許,嚴禁轉載!

簡介

雖然Hashtable和HashMap都是基於雜湊表的資料結構,並且都實現了Map介面,但它們的主要區別在於HashMap不是執行緒安全的,而Hashtable是執行緒安全的。這意味著你不能在沒有同步的情況下在多執行緒Java應用程式中使用HashMap。另一個區別是HashMap允許一個空鍵和空值,但是Hashtable不允許空鍵或值。而且,HashTable的執行緒安全性是使用內部同步實現的,這使得它比HashMap慢。順便提一下,Java中的HashMap和Hashtable之間的區別是核心Java面試中常見的問題之一,以檢查候選人是否理解集合類的正確使用,並瞭解可用的替代解決方案。
除了Java中的HashMap內部如何工作的?ArrayList vs Vector,這是Java中Collection框架中最經常被問及的問題之一。 Hashtable是一個遺留的Collection類,它在Java API中已經有很長一段時間了,但它在Ja​​va 4中被重構以實現Map介面,並且從那裡Hashtable成為Java Collection框架的一部分。
Java中的Hashtable vs HashMap是如此受歡迎的一個問題,它可以列在Java Collection面試題的任何列表中。在進行任何Java程式設計面試之前,你不能不準備HashMap vs Hashtable。在這篇Java文章中,我們不僅會看到HashMap和Hashtable之間的一些重要差異,而且還會看到這兩個集合類之間的一些相似之處。
我們先看看它們有多不同。

Java中HashMap和Hashtable的區別

HashMap和Hashtable都實現了Map介面,但它們之間有一些重要的區別,在決定是使用Java的HashMap還是Hashtable之前,需要記住一些重要的區別。其中一些是執行緒安全,同步和高速的。以下是這些差異:
1.HashMap類大致等同於Hashtable,不同之處在於它是非同步的並且允許空值。 (HashMap允許空值作為鍵和值,而Hashtable不允許空值)。
2. HashMap和Hashtable的主要區別之一是HashMap是非同步的,而Hashtable是同步的,這意味著Hashtable是執行緒安全的,可以在多個執行緒之間共享,但HashMap不能在沒有正確同步的情況下在多個執行緒之間共享。 Java 5引入了ConcurrentHashMap,它是Hashtable的一個替代方案,並提供比Java中的Hashtable更好的可伸縮性。

3. HashMap和Hashtable的另一個顯著區別是,HashMap中的迭代器是一個快速迭代器,而Hashtable的列舉器不是,並且如果任何其他執行緒通過新增或刪除元素,而非通過Iterator自身的remove()修改對映,則丟擲ConcurrentModificationException。但是,這不是一個有保證的行為,並將盡最大努力由JVM完成。這也是Java中的Enumeration和Iterator之間的一個重要區別。
4. Hashtable和HashMap之間的一個更顯著的區別是,由於執行緒安全和同步,如果在單執行緒環境中使用Hashtable比HashMap慢得多。所以,如果你不需要同步,HashMap只能被一個執行緒使用,那麼它比Java中的Hashtable要好。

5. HashMap不能保證Map的順序會隨著時間的推移保持不變。

如果你正在準備這個問題作為你的Java面試準備的一部分,我建議準備在Programming Interviews Exposed給出的每個重要的話題。它涵蓋了基礎知識,核心Java,執行緒,像Spring和Hibernate這樣的框架以及許多其他關鍵主題。

HashMap和Hashtable:關於一些重要術語的註釋

1)同步意味著只有一個執行緒可以在一個時間點修改一個雜湊表。基本上,這意味著在對Hashtable執行更新之前,任何執行緒都必須獲取物件上的鎖,而其他人將等待鎖釋放。

2)故障安全(fail-safe)與迭代器的上下文有關。如果在集合物件上建立了Iterator或ListIterator,並且某個其他執行緒嘗試修改集合物件的“結構”,則將引發併發修改異常。其他執行緒可能呼叫“set”方法,因為它不會“結構性”地修改集合。但是,如果在呼叫“set”之前,集合已經在結構上進行了修改,則會丟擲“IllegalArgumentException”異常。
3)結構性修改是指刪除或插入可以有效改變對映結構的元素。HashMap可以被同步

Map m = Collections.synchronizeMap(hashMap);

總之,Java中的Hashtable和HashMap之間有很大的不同。考慮到執行緒的安全性和速度,只能選擇使用Hashtable,如果你絕對需要執行緒安全,並且執行Java 5及以上版本,可以考慮在Java中使用ConcurrentHashMap。

原文連結

What is difference between HashMap and Hashtable in Java?

相關文章