細說HashTable和HashMap區別

一、線程安全

Hashtable是線程安全的,而HashMap不是線程安全的。java

爲何說Hashtable是線程安全呢?安全

來看下 Hashtable 的源碼,Hashtable 全部的元素操做都是 synchronized 修飾的,而 HashMap 並無。性能

二、性能優劣

既然 Hashtable 是線程安全的,每一個方法都要阻塞其餘線程,因此 Hashtable 性能較差,HashMap 性能較好,使用更廣。spa

若是要線程安全又要保證性能,建議使用 JUC 包下的 ConcurrentHashMap(下節重點講解這個)。線程

三、NULL

Hashtable 是不容許鍵或值爲 null 的,HashMap 的鍵值則均可覺得 null。那麼問題來了,爲何 Hashtable 是不容許 KEY 和 VALUE 爲 null, 而             HashMap 則能夠?3d

Hashtable put 方法邏輯:指針

HashMap hash 方法邏輯:blog

能夠看出 Hashtable key 爲 null 會直接拋出空指針異常,value 爲 null 手動拋出空指針異常,而 HashMap 的邏輯對 null 做了特殊處理。繼承

四、實現方式

Hashtable 的繼承源碼:事件

HashMap 的繼承源碼:

能夠看出二者繼承的類不同,Hashtable 繼承了 Dictionary類,而 HashMap 繼承的是 AbstractMap 類。

Dictionary 是 JDK 1.0 添加的,貌似沒人用過這個,棧長我也沒用過。。

五、容量擴容

HashMap 的初始容量爲:16,Hashtable 初始容量爲:11,二者的負載因子默認都是:0.75。

當現有容量大於總容量 * 負載因子時,HashMap 擴容規則爲當前容量翻倍,Hashtable 擴容規則爲當前容量翻倍 + 1。

六、迭代器

HashMap 中的 Iterator 迭代器是 fail-fast 的,而 Hashtable 的 Enumerator 不是 fail-fast 的。因此,當其餘線程改變了HashMap 的結構, 如:增 加、刪除元素,將會拋出 ConcurrentModificationException 異常,而 Hashtable 則不會。

(先普及一下fail-fast知識。**ail-fast 機制是java集合(Collection)中的一種錯誤機制。**當多個線程對同一個集合的內容進行操做時,就可能會產生fail-fast事件。例如:當某一個線程A經過iterator去遍歷某集合的過程當中,若該集合的內容被其餘線程所改變了;那麼線程A訪問集合時,就會拋出ConcurrentModificationException異常,產生fail-fast事件。)

**            能夠來看下這個區別的演示:**

Hashtable運行結果:

HashMap運行結果:

看到了吧?因此,這條一樣也是 Enumeration 和 Iterator 的區別。

請關注個人博客,這裏定時會更新如今主流技術,這裏只寫大家想學到的,只寫大家想要的,簡單明瞭!!!

相關文章
相關標籤/搜索