HashMap 和 Hashtable 總結(jié)

Map 概述:

Map 用于有映射關(guān)系的數(shù)據(jù)却汉,以 key-value 的形式保存秧均。key 和 value 可以是任何類型的數(shù)據(jù)食侮。

1、key:

key 是不允許重復(fù)的目胡,意思就是同一個 Map 對象的任何兩個 key 通過 equals 方法比較后應(yīng)該返回false锯七。如果我們把一個 Map 集合中所有的 key 放在一起看,它們就組成了一個 Set 集合(所有的 key 是沒有順序的誉己,而且 key 是不可以重復(fù)的)眉尸。而且我們可以通過 keySet()方法獲取 Map 集合中由 key 組成的 Set 集合。

Map 和 Set 的關(guān)系是很密切的。如果把 value 當(dāng)成 key 的附屬的話噪猾,僅僅看 key霉祸,我們就可以把 Map 當(dāng)成 Set 了。事實上袱蜡,Map 內(nèi)部封裝了一個內(nèi)部類:Entry丝蹭。由 Entry 來封裝 key-value,而計算 Entry 存儲時只考慮 Entry 封裝的 key坪蚁。其實 Java源碼中奔穿,是先實現(xiàn)了 Map ,然后通過包裝一個所有 value 都為 null 的 Map 來實現(xiàn) Set 集合敏晤。

2贱田、value:

如果我們把 Map 集合中的所有 value 放在一起看,它們又類似于一個 List:value之間可以重復(fù)茵典,每個 value 可以通過索引(key)來查找湘换。我們可以通過索引來取出 value。只不過這個時候索引值不再是整數(shù)统阿,而是任意類型都可以彩倚。

下面的示例展示了 Map 集合的基本功能:

我們通過 put 方法添加鍵值對,添加數(shù)據(jù)的時候扶平,value 值是可以重復(fù)的帆离;添加 key-value 時,如果 key 重復(fù)结澄,新的 value 會覆蓋原來的 value哥谷,而且此方法會返回原來的 value 值。map 集合可以檢查集合中是否存在指定的 key 或者指定的 value麻献;我們可以使用 map 的 keySet 方法獲取 key 的 set 集合们妥,然后遍歷這個 set 集合,循環(huán)取出 value 值勉吻;我們可以根據(jù) key 去刪除這個 key-value 對监婶。

HashMap 和 Hashtable:

HashMap 、Hashtable 是 Map 接口典型的實現(xiàn)類齿桃,不過 Hashtable 出現(xiàn)的比較早惑惶,比 Map 還要早。

不同點:

1短纵、Hashtable 是一個線程安全的類带污,HashMap 是線程不安全的類,所以 HashMap 的性能好一點香到,但如果多個線程操作 Map 集合鱼冀,可以考慮使用 Hashtable报破。

2、Hashtable 不允許使用 null 作為 key 或者 value雷绢,若果存入 null 將會引發(fā) NullPointExecption泛烙;但是 HashMap 可以使用 null 作為 key 或者 value。但是也只能存入一個 key 為 null 的鍵值對翘紊,因為 key 是不可以重復(fù)的蔽氨,可以存入無數(shù)個 value 為 null 的鍵值對。我們看下例子:


我們先后存入兩隊鍵值對都為 null 的元素帆疟,再存入 key 為 one鹉究,value 為 null 的元素,然后打印輸出集合元素內(nèi)容可以看到:只有兩對鍵值對 null-null 和 one-null踪宠。

類似點:

1自赔、我們知道,HashSet 集合存入元素時柳琢,判斷兩個元素是否相等的依據(jù)是: hashCode 方法的返回值是否相同绍妨,兩個對象通過 equals 方法對比返回 true。而HashMap 對于存入的 key 也是相同的依據(jù):hashCode 方法的返回值要相等柬脸,equals 方法返回 true他去。那如何判斷 兩個value 是否相等呢?依據(jù)比較簡單倒堕,只需要兩個對象通過 equals 方法返回 true 即可灾测。我們可以通過下面示例看一下:

上例中,類 F 有一個屬性 count垦巴,如果 count 相等媳搪,則 hashCode 返回值相等,equals 方法返回true骤宣。類 G 重寫 equals 方法秦爆,無論何時都返回 true。測試代碼中憔披,我們查詢 map 中是否存在 value 值為任意類 G 對象的元素鲜结。我們得到的結(jié)果是存在,因為類 G equals 方法返回 true活逆。當(dāng)我們查詢是否含有 count 值為20的 F 對象時,因為count相等拗胜,hashCode 返回值相等蔗候,equals 返回true,所以埂软,得到的結(jié)果也是存在锈遥。不過這里纫事,我們要注意一個問題,HashMap 調(diào)用 containsValue(Object value) 方法時所灸,方法內(nèi)調(diào)用的是傳入?yún)?shù)的 equals 方法丽惶,而 Hashtable 調(diào)用 containsValue 方法時,方法內(nèi)調(diào)用的是 Hashtable 內(nèi) value 對象的 equals 方法爬立。我們看一下兩個類的源碼就清楚了:

2钾唬、與 HashSet 類似,我們盡量不要修改作為 key 值的元素對象侠驯,因為這會出現(xiàn)無法準(zhǔn)確訪問的問題抡秆,我們看下面的例子:

例子中,我們先存入兩對 key-value吟策,然后取出其中一個 key 為 10000 的數(shù)據(jù)并修改成 39723儒士,然后我們刪除 key=39723的數(shù)據(jù),刪除后檩坚,我們發(fā)現(xiàn) map 集合里還存在一條我們之前修改過的數(shù)據(jù)着撩,之后我們執(zhí)行查詢操作后發(fā)現(xiàn),無論查詢 key=10000的數(shù)據(jù)還是 key=39723的數(shù)據(jù)匾委,結(jié)果都是 null拖叙。所以,我們使用過程中盡量不要修改 key 對象剩檀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憋沿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沪猴,更是在濱河造成了極大的恐慌辐啄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件运嗜,死亡現(xiàn)場離奇詭異壶辜,居然都是意外死亡,警方通過查閱死者的電腦和手機担租,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門砸民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奋救,你說我怎么就攤上這事岭参。” “怎么了尝艘?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵演侯,是天一觀的道長。 經(jīng)常有香客問我背亥,道長秒际,這世上最難降的妖魔是什么悬赏? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮娄徊,結(jié)果婚禮上闽颇,老公的妹妹穿的比我還像新娘。我一直安慰自己寄锐,他們只是感情好兵多,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锐峭,像睡著了一般中鼠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沿癞,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天援雇,我揣著相機與錄音,去河邊找鬼椎扬。 笑死惫搏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚕涤。 我是一名探鬼主播筐赔,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼揖铜!你這毒婦竟也來了茴丰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤天吓,失蹤者是張志新(化名)和其女友劉穎贿肩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龄寞,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡汰规,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了物邑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溜哮。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖色解,靈堂內(nèi)的尸體忽然破棺而出茂嗓,到底是詐尸還是另有隱情,我是刑警寧澤科阎,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布在抛,位于F島的核電站,受9級特大地震影響萧恕,放射性物質(zhì)發(fā)生泄漏刚梭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一票唆、第九天 我趴在偏房一處隱蔽的房頂上張望朴读。 院中可真熱鬧,春花似錦走趋、人聲如沸衅金。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氮唯。三九已至,卻和暖如春姨伟,著一層夾襖步出監(jiān)牢的瞬間惩琉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工夺荒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞒渠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓技扼,卻偏偏與公主長得像伍玖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剿吻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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