HashMap

  • HashMap實際上是一個“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體蹬挤。HashMap 底層就是一個數(shù)組結(jié)構(gòu)缚窿,數(shù)組中的每一項又是一個鏈表。當(dāng)新建一個 HashMap 的時候焰扳,就會初始化一個數(shù)組倦零。


    image.png

hashCode常規(guī)協(xié)定:

  • 在Java應(yīng)用程序執(zhí)行期間,在同一個對象上多次調(diào)用hashCode()方法時,必須一致的返回相同的整數(shù)吨悍,前提是對象上 equals 比較中所用的信息沒有被修改扫茅。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無需保持一致育瓜。
    如果根據(jù) equals(Object) 方法葫隙,兩個對象是相等的,那么在兩個對象中的每個對象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果躏仇。
  • 以下情況不 是必需的:如果根據(jù) equals(java.lang.Object) 方法恋脚,兩個對象不相等,那么在兩個對象中的任一對象上調(diào)用 hashCode 方法必定會生成不同的整數(shù)結(jié)果焰手。但是糟描,程序員應(yīng)該知道,為不相等的對象生成不同整數(shù)結(jié)果可以提高哈希表的性能书妻。
  • 當(dāng)equals方法被重寫時船响,通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對象必須具有相等的哈希碼灿意。
  • hashCode的存在主要是用于查找的快捷性,如Hashtable崇呵,HashMap等缤剧,hashCode是用來在散列存儲結(jié)構(gòu)中確定對象的存儲地址的;
  • 如果兩個對象相同域慷,就是適用于equals(java.lang.Object) 方法荒辕,那么這兩個對象的hashCode一定要相同;
  • 兩個對象的hashCode相同犹褒,并不一定表示兩個對象就相同抵窒,也就是不一定適用于equals(java.lang.Object) 方法,只能夠說明這兩個對象在散列存儲結(jié)構(gòu)中叠骑,如Hashtable李皇,他們“存放在同一個籃子里”。

對最后一條的說明:
hashCode是用來查找的:
比如內(nèi)存中有這樣的位置 :0 1 2 3 4 5 6 7
而我有個類宙枷,這個類有個字段叫ID,我要把這個類存放在以上8個位置之一掉房,如果不用hashcode而任意存放,那么當(dāng)查找時就需要到這八個位置里挨個去找慰丛,或者用二分法一類的算法卓囚。
而使用hashCode那就會使效率提高很多。

我們這個類中有個字段叫ID,那么我們就定義我們的hashcode為ID%8诅病,然后把我們的類存放在取得得余數(shù)那個位置哪亿。比如我們的ID為9,9除8的余數(shù)為1贤笆,那么我們就把該類存在1這個位置蝇棉,如果ID是13,求得的余數(shù)是5苏潜,那么我們就把該類放在5這個位置银萍。這樣,以后在查找該類時就可以通過ID除 8求余數(shù)直接找到存放的位置了恤左。
但是如果兩個類有相同的hashcode怎么辦那(我們假設(shè)上面的類的ID不是唯一的)贴唇,例如9除以8和17除以8的余數(shù)都是1,那么這是不是合法的飞袋,回答是:可以這樣戳气。那么如何判斷呢?在這個時候就需要定義 equals了巧鸭。
也就是說瓶您,我們先通過 hashcode來判斷兩個類是否存放某個桶里,但這個桶里可能有很多類,那么我們就需要再通過 equals 來在這個桶里找到我們要的類呀袱。
那么贸毕。重寫了equals(),為什么還要重寫hashCode()呢夜赵?
想想明棍,你要在一個桶里找東西,你必須先要找到這個桶啊寇僧,你不通過重寫hashcode()來找到桶摊腋,光重寫equals()有什么用啊


總結(jié):

就像一開始那張圖片顯示的那樣,hashMap中的hashCode用來確認(rèn)要搜索的文件在數(shù)組中的位置嘁傀,但是由于可能存在兩個類可能存在同一個hashCode的情況兴蒸,就是說,一個數(shù)組的特定一個位置有可能存在多個數(shù)據(jù)细办,這在HasnMap中就表現(xiàn)為上圖中的那個鏈表橙凳,這個鏈表中存儲的對象擁有同樣的hashCode,所以查找的時候需要找到對象在數(shù)組中的位置,還需要和鏈表中的位置進(jìn)行對比笑撞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痕惋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娃殖,更是在濱河造成了極大的恐慌值戳,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炉爆,死亡現(xiàn)場離奇詭異堕虹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芬首,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門赴捞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人郁稍,你說我怎么就攤上這事赦政。” “怎么了耀怜?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵恢着,是天一觀的道長。 經(jīng)常有香客問我财破,道長掰派,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任左痢,我火速辦了婚禮靡羡,結(jié)果婚禮上系洛,老公的妹妹穿的比我還像新娘。我一直安慰自己略步,他們只是感情好描扯,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趟薄,像睡著了一般荆烈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竟趾,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音宫峦,去河邊找鬼岔帽。 笑死,一個胖子當(dāng)著我的面吹牛导绷,可吹牛的內(nèi)容都是我干的犀勒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼妥曲,長吁一口氣:“原來是場噩夢啊……” “哼贾费!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起檐盟,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤褂萧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后葵萎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體导犹,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年羡忘,在試婚紗的時候發(fā)現(xiàn)自己被綠了谎痢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡卷雕,死狀恐怖节猿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漫雕,我是刑警寧澤滨嘱,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站浸间,受9級特大地震影響九孩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜发框,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一躺彬、第九天 我趴在偏房一處隱蔽的房頂上張望煤墙。 院中可真熱鬧,春花似錦宪拥、人聲如沸仿野。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚作。三九已至,卻和暖如春缔刹,著一層夾襖步出監(jiān)牢的瞬間球涛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工校镐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留亿扁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓鸟廓,卻偏偏與公主長得像从祝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子引谜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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

  • HashMap 是 Java 面試必考的知識點牍陌,面試官從這個小知識點就可以了解我們對 Java 基礎(chǔ)的掌握程度。網(wǎng)...
    野狗子嗷嗷嗷閱讀 6,662評論 9 107
  • Java集合:HashMap源碼剖析 一员咽、HashMap概述 二毒涧、HashMap的數(shù)據(jù)結(jié)構(gòu) 三、HashMap源碼...
    記住時光閱讀 729評論 2 1
  • HashMap HashMap概述 HashMap基于哈希表的 Map 接口的實現(xiàn)贝室。此實現(xiàn)提供所有可選的映射操作链嘀,...
    史路比閱讀 291評論 0 6
  • 2013年6月相愛,2014年9月開始異國戀档玻,2015年9月Selina回國怀泊,2016年3月分手。但误趴,這個分手卻藕...
    陳煒杭閱讀 236評論 0 0
  • 日內(nèi)焦點: 15:30 瑞士3M LIBOR目標(biāo)利率 15:30 瑞士伯爾尼 瑞士央行貨幣政策評估 19:00 英...
    mengpo閱讀 267評論 0 0