HashMap和Hashtable的區(qū)別

HashMap和Hashtable都實(shí)現(xiàn)了Map接口松蒜,但決定用哪一個(gè)之前先要弄清楚它們之間的分別幢哨。主要的區(qū)別有:線程安全性雄人,同步(synchronization),以及速度矩距。

1.HashMap幾乎可以等價(jià)于Hashtable拗盒,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value)锥债,而Hashtable則不行)陡蝇。

2.HashMap是非synchronized,而Hashtable是synchronized哮肚,這意味著Hashtable是線程安全的毅整,多個(gè)線程可以共享一個(gè)Hashtable;而如果沒(méi)有正確的同步的話绽左,多個(gè)線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap艇潭,它是HashTable的替代拼窥,比HashTable的擴(kuò)展性更好。

  1. Hashtable蹋凝、HashMap都使用了 Iterator鲁纠。而由于歷史原因,Hashtable還使用了Enumeration的方式 鳍寂。
    HashMap的迭代器(Iterator)是fail-fast迭代器改含,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素)迄汛,將會(huì)拋出"ConcurrentModificationException"捍壤,但迭代器本身的remove()方法移除元素則不會(huì)拋出"ConcurrentModificationException"異常。但這并不是一個(gè)一定發(fā)生的行為鞍爱,要看JVM鹃觉。這條同樣也是Enumeration和Iterator的區(qū)別。

4.由于Hashtable是線程安全的也是synchronized睹逃,所以在單線程環(huán)境下它比HashMap要慢盗扇。如果你不需要同步,只需要單一線程沉填,那么使用HashMap性能要好過(guò)Hashtable疗隶。

5.HashMap不能保證隨著時(shí)間的推移Map中的元素次序是不變的。

  1. HashMap把Hashtable的contains方法去掉了翼闹,改成containsValue和containsKey斑鼻,因?yàn)閏ontains方法容易讓人引起誤解。
    Hashtable則保留了contains橄碾,containsValue和containsKey三個(gè)方法卵沉,其中contains和containsValue功能相同颠锉。

7.hash值不同
哈希值的使用不同,HashTable直接使用對(duì)象的hashCode史汗。而HashMap重新計(jì)算hash值琼掠。
hashCode是jdk根據(jù)對(duì)象的地址或者字符串或者數(shù)字算出來(lái)的int類(lèi)型的數(shù)值。
Hashtable計(jì)算hash值停撞,直接用key的hashCode()瓷蛙,而HashMap重新計(jì)算了key的hash值,Hashtable在求hash值對(duì)應(yīng)的位置索引時(shí)戈毒,用取模運(yùn)算艰猬,而HashMap在求位置索引時(shí),則用與運(yùn)算埋市,且這里一般先用hash&0x7FFFFFFF后冠桃,再對(duì)length取模,&0x7FFFFFFF的目的是為了將負(fù)的hash值轉(zhuǎn)化為正值道宅,因?yàn)閔ash值有可能為負(fù)數(shù)食听,而&0x7FFFFFFF后,只有符號(hào)外改變污茵,而后面的位都不變樱报。

8.內(nèi)部實(shí)現(xiàn)使用的數(shù)組初始化和擴(kuò)容方式不同
HashTable在不指定容量的情況下的默認(rèn)容量為11,而HashMap為16泞当,Hashtable不要求底層數(shù)組的容量一定要為2的整數(shù)次冪迹蛤,而HashMap則要求一定為2的整數(shù)次冪。
Hashtable擴(kuò)容時(shí)襟士,將容量變?yōu)樵瓉?lái)的2倍加1盗飒,而HashMap擴(kuò)容時(shí),將容量變?yōu)樵瓉?lái)的2倍陋桂。
Hashtable和HashMap它們兩個(gè)內(nèi)部實(shí)現(xiàn)方式的數(shù)組的初始大小和擴(kuò)容的方式箩兽。HashTable中hash數(shù)組默認(rèn)大小是11,增加的方式是 old*2+1章喉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汗贫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秸脱,更是在濱河造成了極大的恐慌落包,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊唇,死亡現(xiàn)場(chǎng)離奇詭異咐蝇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)巷查,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)有序,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抹腿,“玉大人,你說(shuō)我怎么就攤上這事旭寿【ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵盅称,是天一觀的道長(zhǎng)肩祥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缩膝,這世上最難降的妖魔是什么混狠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮疾层,結(jié)果婚禮上将饺,老公的妹妹穿的比我還像新娘。我一直安慰自己痛黎,他們只是感情好俯逾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舅逸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皇筛。 梳的紋絲不亂的頭發(fā)上琉历,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音水醋,去河邊找鬼旗笔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拄踪,可吹牛的內(nèi)容都是我干的蝇恶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惶桐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撮弧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起姚糊,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贿衍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后救恨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贸辈,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年肠槽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了擎淤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奢啥。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嘴拢,靈堂內(nèi)的尸體忽然破棺而出桩盲,到底是詐尸還是另有隱情,我是刑警寧澤炊汤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布正驻,位于F島的核電站,受9級(jí)特大地震影響抢腐,放射性物質(zhì)發(fā)生泄漏姑曙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一迈倍、第九天 我趴在偏房一處隱蔽的房頂上張望伤靠。 院中可真熱鬧,春花似錦啼染、人聲如沸宴合。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卦洽。三九已至,卻和暖如春斜棚,著一層夾襖步出監(jiān)牢的瞬間阀蒂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工弟蚀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚤霞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓义钉,卻偏偏與公主長(zhǎng)得像昧绣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捶闸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354