HashMap和HashTable,這二者的區別經常被別人問起,今天在此總結一下。
(一)繼承的歷史不同
1
2
|
public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map |
Hashtable是繼承自Dictionary類的,而HashMap則是Java 1.2引進的Map接口的一個實現。
(二)安全性不同
HashMap是非synchronized,而HashTable在默認的情況下是synchronized,這意味著HashTable是線程安全的,多個線程可以共享一個HashTable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5以后提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。當然,我們可以通過以下方法讓HashMap同步:
1
|
Map m = Collections.synchronizeMap(hashMap); |
(三)是否可為空值的異同
HashMap可以讓你將空值作為一個表條目的key或value。HashMap中只有一條記錄可以是一個空的key,但任意數量的條目可以是空的value。這就是說,如果在表中沒有發現搜索鍵,或者如果發現了搜索鍵,但它是一個空的值,那么get()將返回null;而HashTable則不行,key和value都不允許出現null值。
(四)二者的遍歷方式的內部實現上不同
Hashtable、HashMap都使用了 Iterator迭代器,HashMap的迭代器(Iterator)是fail-fast迭代器,而HashTable的enumerator迭代器不是fail-fast的。而由于歷史原因,Hashtable還使用了Enumeration的方式 。
(五)哈希值的使用不同
HashTable直接使用對象的hashCode,而HashMap則需要重新計算hash值。
(六)二者內部實現方式的數組的初始大小和擴容的方式不同
HashTable中hash數組默認大小是11,增加的方式是 old*2+1;HashMap中hash數組的默認大小是16,而且一定是2的指數。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/mynameishuangshuai/article/details/52748731