Java集合面試題(03) Java中HashMap和HashTable之間區別
宣告:本文為本博主翻譯,未經允許,嚴禁轉載!
簡介
雖然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中已經有很長一段時間了,但它在Java 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。
原文連結
相關文章
- java複習之HashMap和Hashtable的區別JavaHashMap
- Java集合詳解4:一文讀懂HashMap和HashTable的區別以及常見面試題JavaHashMap面試題
- 集合類HashMap,HashTable,ConcurrentHashMap區別?HashMap
- Java集合系列(四):HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及區別JavaHashMap
- C#中Hashtable和HashMap的區別C#HashMap
- Java集合之HashMapJavaHashMap
- Java集合之Hashtable原始碼解析Java原始碼
- Java集合系列之---HashMapJavaHashMap
- 【java】【Map】HashMap、Hashtable、CollectionsJavaHashMap
- HashMap、HashTable、ConcurrentHashMap的區別HashMap
- 【Java面試題系列】:Java中final finally finalize的區別Java面試題
- Java Collection集合面試題Java面試題
- Java經典面試題: == 和 equals( )的區別Java面試題
- 【Java面試】Spring中 BeanFactory和FactoryBean的區別Java面試SpringBean
- java面試題-HashMap的工作原理Java面試題HashMap
- Java集合:HashMapJavaHashMap
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- Java集合高頻面試題Java面試題
- Java面試題:Java中的集合及其繼承關係Java面試題繼承
- Java面試題 equals()與"=="的區別?Java面試題
- java面試題之Thread的run()和start()方法有什麼區別Java面試題thread
- 【Java面試】Mybatis中#{}和${}的區別是什麼?Java面試MyBatis
- HashMap、Hashtable、ConcurrentHashMap的原理與區別HashMap
- 【Java面試】@Resource 和 @Autowired 的區別Java面試
- 面試必備 之 Java 集合框架面試Java框架
- Java面試題-集合框架篇三Java面試題框架
- Java中HashMap,LinkedHashMap,TreeMap的區別[轉]JavaHashMap
- Hashtable和HashMapHashMap
- Java集合(6)之 HashMap 原始碼解析JavaHashMap原始碼
- 帶你走進Java集合之HashMapJavaHashMap
- 好程式設計師Java培訓分享Java面試題之Java集合篇三程式設計師Java面試題
- java多執行緒、集合和IO面試題_02Java執行緒面試題
- Java 集合Hashtable原始碼深入解析Java原始碼
- 容器(一)剖析面試最常見問題之 Java 集合框架面試Java框架
- Java:面試題:抽象類與介面的區別Java面試題抽象
- Java之HashMap集合簡介及遍歷JavaHashMap
- 死磕 java集合之HashMap原始碼分析JavaHashMap原始碼
- 【Java面試】IO和NIO有什麼區別?Java面試
- JAVA面試題 StringBuffer和StringBuilder的區別,從原始碼角度分析?Java面試題UI原始碼