HashMap与HashTable联系与区别
HashMap與HashTable
1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
2.hashTable同步的,而HashMap是非同步的,效率上比hashTable要高,HashMap不是線(xiàn)程安全的 ,HashTable是線(xiàn)程安全的一個(gè)Collection。
3.hashMap允許空鍵值,而hashTable不允許。
ashtable繼承自Dictionary類(lèi),而HashMap是Map接口的一個(gè)實(shí)現(xiàn)。這里要說(shuō)明一下Dictionary類(lèi)是jdk1.0中就有的,而Map接口是1.2之后才有的,當(dāng)然與此同時(shí)Hashtable也實(shí)現(xiàn)了Map接口。
HashTable的應(yīng)用非常廣泛,HashMap是新框架中用來(lái)代替HashTable的類(lèi),也就是說(shuō)建議使用HashMap,不要使用HashTable??赡苣阌X(jué)得HashTable很好用,為什么不用呢?這里簡(jiǎn)單分析他們的區(qū)別。
1.HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線(xiàn)程場(chǎng)合要手動(dòng)同步HashMap這個(gè)區(qū)別就像Vector和ArrayList一樣。
2.HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。
3.HashTable有一個(gè)contains(Object value),功能和containsValue(Object value)功能一樣。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它們的實(shí)現(xiàn)也有很大的不同。
5.HashTable中hash數(shù)組默認(rèn)大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認(rèn)大小是16,而且一定是2的指數(shù)。
6.哈希值的使用不同,HashTable直接使用對(duì)象的hashCode,代碼是這樣的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新計(jì)算hash值,而且用與代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
?
static int hash(Object x) {
int h = x.hashCode();
?
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
?
HashMap和Hashtable的相同點(diǎn)
HashMap和Hashtable都是存儲(chǔ)“鍵值對(duì)(key-value)”的散列表,而且都是采用拉鏈法實(shí)現(xiàn)的。
存儲(chǔ)的思想都是:通過(guò)table數(shù)組存儲(chǔ),數(shù)組的每一個(gè)元素都是一個(gè)Entry;而一個(gè)Entry就是一個(gè)單向鏈表,Entry鏈表中的每一個(gè)節(jié)點(diǎn)就保存了key-value鍵值對(duì)數(shù)據(jù)。
?
添加key-value鍵值對(duì):首先,根據(jù)key值計(jì)算出哈希值,再計(jì)算出數(shù)組索引(即,該key-value在table中的索引)。然后,根據(jù)數(shù)組索引找到Entry(即,單向鏈表),再遍歷單向鏈表,將key和鏈表中的每一個(gè)節(jié)點(diǎn)的key進(jìn)行對(duì)比。若key已經(jīng)存在Entry鏈表中,則用該value值取代舊的value值;若key不存在Entry鏈表中,則新建一個(gè)key-value節(jié)點(diǎn),并將該節(jié)點(diǎn)插入Entry鏈表的表頭位置。
刪除key-value鍵值對(duì):刪除鍵值對(duì),相比于“添加鍵值對(duì)”來(lái)說(shuō),簡(jiǎn)單很多。首先,還是根據(jù)key計(jì)算出哈希值,再計(jì)算出數(shù)組索引(即,該key-value在table中的索引)。然后,根據(jù)索引找出Entry(即,單向鏈表)。若節(jié)點(diǎn)key-value存在與鏈表Entry中,則刪除鏈表中的節(jié)點(diǎn)即可。
HashMap和Hashtable的不同點(diǎn)
1 繼承和實(shí)現(xiàn)方式不同
HashMap 繼承于A(yíng)bstractMap,實(shí)現(xiàn)了Map、Cloneable、java.io.Serializable接口。
Hashtable 繼承于Dictionary,實(shí)現(xiàn)了Map、Cloneable、java.io.Serializable接口。
2 線(xiàn)程安全不同
Hashtable的幾乎所有函數(shù)都是同步的,即它是線(xiàn)程安全的,支持多線(xiàn)程。
而HashMap的函數(shù)則是非同步的,它不是線(xiàn)程安全的。 若要在多線(xiàn)程中使用HashMap,需要我們額外的進(jìn)行同步處理。 對(duì)HashMap的同步處理可以使用Collections類(lèi)提供的synchronizedMap靜態(tài)方法,或者直接使用JDK 5.0之后提供的java.util.concurrent包里的ConcurrentHashMap類(lèi)。
3 對(duì)null值的處理不同
HashMap的key、value都可以為null。
Hashtable的key、value都不可以為null。
Hashtable的key或value,都不能為null!否則,會(huì)拋出異常NullPointerException。
HashMap的key、value都可以為null。 當(dāng)HashMap的key為null時(shí),HashMap會(huì)將其固定的插入table[0]位置(即HashMap散列表的第一個(gè)位置);而且 table[0]處只會(huì)容納一個(gè)key為null的值,當(dāng)有多個(gè)key為null的值插入的時(shí)候,table[0]會(huì)保留最后插入的value。
4 支持的遍歷種類(lèi)不同
HashMap只支持Iterator(迭代器)遍歷。
而Hashtable支持Iterator(迭代器)和Enumeration(枚舉器)兩種方式遍歷。
5 通過(guò)Iterator迭代器遍歷時(shí),遍歷的順序不同
HashMap是“從前向后”的遍歷數(shù)組;再對(duì)數(shù)組具體某一項(xiàng)對(duì)應(yīng)的鏈表,從表頭開(kāi)始進(jìn)行遍歷。
Hashtable是“從后往前”的遍歷數(shù)組;再對(duì)數(shù)組具體某一項(xiàng)對(duì)應(yīng)的鏈表,從表頭開(kāi)始進(jìn)行遍歷。
6 容量的初始值 和 增加方式都不一樣
HashMap默認(rèn)的容量大小是16;增加容量時(shí),每次將容量變?yōu)?strong>“原始容量x2”。
Hashtable默認(rèn)的容量大小是11;增加容量時(shí),每次將容量變?yōu)椤?strong>原始容量x2 + 1”。
7 添加key-value時(shí)的hash值算法不同
HashMap添加元素時(shí),是使用自定義的哈希算法。
Hashtable沒(méi)有自定義哈希算法,而直接采用的key的hashCode()。
?
HashMap和WeakHashMap的相同點(diǎn)
1 它們都是散列表,存儲(chǔ)的是“鍵值對(duì)”映射。
2 它們都繼承于A(yíng)bstractMap,并且實(shí)現(xiàn)Map基礎(chǔ)。
3 它們的構(gòu)造函數(shù)都一樣。
? ?它們都包括4個(gè)構(gòu)造函數(shù),而且函數(shù)的參數(shù)都一樣。
4 默認(rèn)的容量大小是16,默認(rèn)的加載因子是0.75。
5 它們的“鍵”和“值”都允許為null。
6 它們都是“非同步的”。
HashMap和WeakHashMap的不同點(diǎn)
1 HashMap實(shí)現(xiàn)了Cloneable和Serializable接口,而WeakHashMap沒(méi)有。
2 HashMap的“鍵”是“強(qiáng)引用(StrongReference)”,而WeakHashMap的鍵是“弱引用(WeakReference)”。
轉(zhuǎn)載于:https://www.cnblogs.com/wzyxidian/p/3783621.html
總結(jié)
以上是生活随笔為你收集整理的HashMap与HashTable联系与区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#中Dictionary的用法
- 下一篇: bzoj1715[Usaco2006 D