HashMap與HashTable的區(qū)別與聯(lián)系

1.HashMap與HashTable相同點(diǎn)

  • 1.二者都是以哈希表(數(shù)組+鏈表)數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù).
  • 2.二者都可以進(jìn)行數(shù)組擴(kuò)容

2.HashMap與HashTable區(qū)別

  • 1.是否線程安全
    HashMap不是線程安全的工三,HashTable是線程安全的;【HashTable內(nèi)部的方法基本都使用了synchronized關(guān)鍵字修飾】
    注意:現(xiàn)在HashTable在我們的開發(fā)中很少很少使用偎漫。如果你要保證線程安全清女,推薦使用ConcurrentHashMap

  • 2.效率
    因?yàn)榫€程安全的問題赶撰,HashMap要比HashTable的效率高一點(diǎn)。

  • 3.對于Null Key和Null Value的支持
    HashMap中,null可以作為key红氯,但是這樣的key只能有一個(gè);可以有一個(gè)或者多個(gè)鍵對應(yīng)的value為null;
    HashTable中不支持key為null咕痛,如果put使用null痢甘,那么就會(huì)拋出NullPointerException異常;

  • 4.初始容量和每次擴(kuò)充容量的大小不同
    HashMap創(chuàng)建的時(shí)候如果不指定容量大小茉贡,初始容量大小為16塞栅,之后每次擴(kuò)充,容量變?yōu)樵瓉淼?倍腔丧;
    HashTable創(chuàng)建的時(shí)候如果不指定容量大小放椰,初始容量大小為11,之后每次擴(kuò)充愉粤,容量會(huì)變?yōu)?n + 1砾医;
    HashMap創(chuàng)建的時(shí)候給定初始容量大小,HashMap 會(huì)將其擴(kuò)充為2的冪次方大幸吕濉(HashMap 中的tableSizeFor()方法保證如蚜,下面給出了源代碼)。也就是說 HashMap 總是使用2的冪作為哈希表的大小,后面會(huì)介紹到為什么是2的冪次方影暴。

  • 5.繼承的父類不同
    HashMap繼承自AbstractMap類错邦。但二者都實(shí)現(xiàn)了Map接口。
    Hashtable繼承自Dictionary類型宙,Dictionary類是一個(gè)已經(jīng)被廢棄的類(見其源碼中的注釋)撬呢。父類都被廢棄,自然而然也沒人用它的子類Hashtable了

  • 6.支持的遍歷種類不同:
    HashMap只支持Iterator遍歷,而HashTable支持Iterator和Enumeration(枚舉)兩種方式遍歷

  • 7.計(jì)算hash值方式不同
    為了得到元素的位置妆兑,首先需要根據(jù)元素的 KEY計(jì)算出一個(gè)hash值魂拦,然后再用這個(gè)hash值來計(jì)算得到最終的位置。
    ①:HashMap有個(gè)hash方法重新計(jì)算了key的hash值,因?yàn)閔ash沖突變高搁嗓,所以通過一種方法重算hash值的方法:

static final int hash(Object key) {
 int h;
 return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

注意:這里計(jì)算hash值晨另,先調(diào)用hashCode方法計(jì)算出來一個(gè)hash值,再將hash與右移16位后相異或(異或計(jì)算方式:相同為0谱姓,不相同為1借尿,可以理解為不進(jìn)位相加),從而得到新的hash值。

例子:

十進(jìn)制:3254818
注意:int類型 占4byte 32位
處理數(shù)據(jù)
二進(jìn)制:11 0001 1010 1010 0010 0010 (22位路翻,不足32位狈癞,則補(bǔ)0到32位)
0000 0000 0011 0001 1010 1010 0010 0010 (32位)
h>>>16 無符號右移16位
0000 0000 0000 0000 0000 0000 0011 0001
^ 異或操作:相同為0,不相同為1茂契,可以理解為不進(jìn)位相加
數(shù)據(jù)處理完畢蝶桶,開始進(jìn)行異或操作
h = key.hashCode() ^ (h >>> 16)
0000 0000 0011 0001 1010 1010 0010 0010 ( h = key.hashCode())
^ (異或)
0000 0000 0000 0000 0000 0000 0011 0001 (h >>> 16)
結(jié)果為:
0000 0000 0011 0001 1010 1010 0001 0011
3245803 (十進(jìn)制結(jié)果)

②:Hashtable通過計(jì)算key的hashCode()來得到hash值就為最終hash值。

  • 8.解決hash沖突方式不同(地址沖突)
    JDK1.8 以后的 HashMap 在解決哈希沖突時(shí)有了較大的變化掉冶,當(dāng)鏈表長度大于閾值(默認(rèn)為8)時(shí)真竖,將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時(shí)間厌小;
    而在HashTable中恢共, 都是以鏈表方式存儲
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市璧亚,隨后出現(xiàn)的幾起案子讨韭,更是在濱河造成了極大的恐慌,老刑警劉巖癣蟋,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件透硝,死亡現(xiàn)場離奇詭異,居然都是意外死亡疯搅,警方通過查閱死者的電腦和手機(jī)濒生,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幔欧,“玉大人甜攀,你說我怎么就攤上這事∷龉荩” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵恒序,是天一觀的道長瘦麸。 經(jīng)常有香客問我,道長歧胁,這世上最難降的妖魔是什么滋饲? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮喊巍,結(jié)果婚禮上屠缭,老公的妹妹穿的比我還像新娘。我一直安慰自己崭参,他們只是感情好呵曹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般奄喂。 火紅的嫁衣襯著肌膚如雪铐殃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天跨新,我揣著相機(jī)與錄音富腊,去河邊找鬼。 笑死域帐,一個(gè)胖子當(dāng)著我的面吹牛赘被,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肖揣,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼民假,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了许饿?” 一聲冷哼從身側(cè)響起阳欲,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陋率,沒想到半個(gè)月后球化,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓦糟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年筒愚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩浙。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巢掺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劲蜻,到底是詐尸還是另有隱情陆淀,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布先嬉,位于F島的核電站轧苫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疫蔓。R本人自食惡果不足惜含懊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衅胀。 院中可真熱鬧岔乔,春花似錦、人聲如沸滚躯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剿配,卻和暖如春搅幅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呼胚。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工茄唐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝇更。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓沪编,卻偏偏與公主長得像,于是被迫代替她去往敵國和親年扩。 傳聞我的和親對象是個(gè)殘疾皇子蚁廓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容