面試知識點—HashMap和Hashtable的比較
HashMap和Hashtable的比較也是Android面試過程中考察Java基礎知識的常見問題,面試者常用它來考驗程式設計師是否能夠正確的使用集合類解決問題。所以在參加任何Java相關的面試之前,都應該好好準備一下這一道面試題。
我們先來介紹一下兩者的相同點,然後再比較一下不同之處。
相同點:
1、元素種類
它們都是鍵值對容器,容器中的元素對應的鍵和值都要是物件,而不應該是基本資料型別的資料,比如不應該是int,char型別,應該是Integer,Char型別的物件。並且不能包含重複鍵(key),但可以包含重複值(value);
2、內部實現演算法
Hashtable和HashMap採用的hash/rehash演算法基本都一樣;
3、實現的介面
它們都實現了Map介面;
不同點:
1、執行緒同步和安全方面
HashTable是JDK1.0引就引入的第一個關聯集合類,它是執行緒安全的,它的所有方法都是執行緒同步的。而HashMap是JDK2.0才引入的集合類,它是非執行緒同步的,所以效率上比HashTable要高。所以這個區別和Vector和ArrayList是相同的。
HashMap提供了一個不同步的基類AbstractMap和一個同步的包裝器synchronizedMap。synchronizedMap被稱為有條件的執行緒安全類,利用它可以實現執行緒安全。
方法是,
Map m = Collections.synchronizedMap(new HashMap());
另外,在JDK5.0上,util.concurrent包中引入一個新的HashMap型別--ConcurrentHashMap,它可以對執行緒起到安全作用,比起synchronizedMap, 它提供了更高的靈活性,同時進行的讀和寫操作都可以併發地執行。用它可以完全替代掉synchronizedMap方式。
同時,util.concurrent包也提供了一個執行緒安全的CopyOnWriteArrayList用來替代ArrayList。
2、鍵值型別
HashTable不允許有null值,無論key和value都不可以,而HashMap允許有null值,並且key和value都可以。但是HashMap允許 key值只能有一個null值,因為HashMap的key值是唯一的,如果出現相同的key值,則新的key對應的value將替代舊的value。
3、包含的方法
HashTable有一個contains(Object value)方法,而HashMap去掉了contains方法,但是加上了containsValue(Object value)和containsKey(Object key)這兩個方法。
4、迭代器差異
遍歷的時候,HashTable使用Enumeration,HashMap使用Iterator。
HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的迭代器(Enumeration)不是fail-fast的。所以當有其它執行緒改變了HashMap的結構(增加或者移除元素),將會丟擲ConcurrentModificationException,因為它是執行緒不安全的。
5、基類不同
Hashtable繼承自Dictionary類,實現了Map介面。而HashMap是繼承自AbstractMap,也實現了Map介面。
6、元素遞增方式不同
HashTable中hash陣列預設大小是11,增加的方式是 old*2+1。而HashMap中hash陣列的預設大小是16,增加方式old*2。
綜上,如果用在單執行緒環境下應該使用HashMap,因為它不需要考慮執行緒同步,速度會比較快。如果用在多執行緒環境,並且開發環境是Java 5或以上的話,可以考慮使用ConcurrentHashMap,它比HashTable要新,效率可能會更高一些。