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