日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

HashMap与HashTable联系与区别

發(fā)布時(shí)間:2024/4/14 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HashMap与HashTable联系与区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

HashMapHashTable

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)

HashMapHashtable都是存儲(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。