散列

HashMap

HashMap也是我們使用非常多的Collection逃糟,它是基于哈希表的 Map 接口的實(shí)現(xiàn)吼鱼,以key-value的形式存在。在HashMap中绰咽,key-value總是會(huì)當(dāng)做一個(gè)整體來處理菇肃,系統(tǒng)會(huì)根據(jù)hash算法來來計(jì)算key-value的存儲(chǔ)位置,我們總是可以通過key快速地存取募、取value琐谤。

實(shí)際上HashMap是一個(gè)“鏈表散列”HashMap底層實(shí)現(xiàn)還是數(shù)組,只是數(shù)組的每一項(xiàng)都是一條鏈玩敏。

HashMap保存數(shù)據(jù)的過程

首先判斷key是否為null斗忌,若為null质礼,則直接調(diào)用putForNullKey方法。若不為空則先計(jì)算key的hash值织阳,然后根據(jù)hash值搜索在table數(shù)組中的索引位置眶蕉,如果table數(shù)組在該位置處有元素,則通過比較是否存在相同的key唧躲,若存在則覆蓋原來key的value造挽,否則將該元素保存在鏈頭(最先保存的元素放在鏈尾)。若table在該處沒有元素弄痹,則直接保存刽宪。

put方法流程

當(dāng)我們調(diào)用put存值時(shí),HashMap首先會(huì)調(diào)用K的hashCode方法界酒,獲取哈希碼圣拄,通過哈希碼快速找到某個(gè)存放位置,這個(gè)位置可以被稱之為bucketIndex毁欣,通過hashCode的協(xié)定可以知道庇谆,如果hashCode不同,equals一定為false凭疮,如果hashCode相同饭耳,equals不一定為true。所以理論上执解,hashCode可能存在沖突的情況寞肖,有個(gè)專業(yè)名詞叫碰撞,當(dāng)碰撞發(fā)生時(shí)衰腌,計(jì)算出的bucketIndex也是相同的新蟆,這時(shí)會(huì)取到bucketIndex位置已存儲(chǔ)的元素,最終通過equals來比較右蕊,equals方法就是哈希碼碰撞時(shí)才會(huì)執(zhí)行的方法琼稻,所以前面說HashMap很少會(huì)用到equals。HashMap通過hashCode和equals最終判斷出K是否已存在饶囚,如果已存在帕翻,則使用新V值替換舊V值,并返回舊V值萝风,如果不存在 嘀掸,則存放新的鍵值對<K, V>到bucketIndex位置。

hashCode 的常規(guī)協(xié)定
在 Java 應(yīng)用程序執(zhí)行期間规惰,在同一對象上多次調(diào)用 hashCode 方法時(shí)睬塌,必須一致地返回相同的整數(shù),
前提是對象上 equals 比較中所用的信息沒有被修改。

如果根據(jù) equals(Object) 方法衫仑,兩個(gè)對象是相等的梨与,
那么在兩個(gè)對象中的每個(gè)對象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末文狱,一起剝皮案震驚了整個(gè)濱河市粥鞋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞄崇,老刑警劉巖呻粹,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苏研,居然都是意外死亡等浊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門摹蘑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筹燕,“玉大人,你說我怎么就攤上這事衅鹿∪鲎伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵大渤,是天一觀的道長制妄。 經(jīng)常有香客問我,道長泵三,這世上最難降的妖魔是什么耕捞? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮烫幕,結(jié)果婚禮上俺抽,老公的妹妹穿的比我還像新娘。我一直安慰自己纬霞,他們只是感情好凌埂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诗芜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埃疫。 梳的紋絲不亂的頭發(fā)上伏恐,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音栓霜,去河邊找鬼翠桦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的销凑。 我是一名探鬼主播丛晌,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斗幼!你這毒婦竟也來了澎蛛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜕窿,失蹤者是張志新(化名)和其女友劉穎谋逻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桐经,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毁兆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阴挣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片气堕。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畔咧,靈堂內(nèi)的尸體忽然破棺而出送巡,到底是詐尸還是另有隱情,我是刑警寧澤盒卸,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布骗爆,位于F島的核電站,受9級(jí)特大地震影響蔽介,放射性物質(zhì)發(fā)生泄漏摘投。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一虹蓄、第九天 我趴在偏房一處隱蔽的房頂上張望犀呼。 院中可真熱鬧,春花似錦薇组、人聲如沸外臂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宋光。三九已至,卻和暖如春炭菌,著一層夾襖步出監(jiān)牢的瞬間罪佳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工黑低, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赘艳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像蕾管,于是被迫代替她去往敵國和親枷踏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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

  • 哈希碼是一個(gè)散列值掰曾,通過單向函數(shù)求得旭蠕,范圍是int,數(shù)量有限婴梧,所以會(huì)發(fā)生散列值沖突下梢。HashMap、Hashtab...
    NiklausTxt閱讀 449評論 0 0
  • 眾所周知,使用Java的HashMap數(shù)據(jù)結(jié)構(gòu)時(shí)番电,要求正確實(shí)現(xiàn)hashCode()岗屏,但是為什么呢?hashCode...
    登高且賦閱讀 1,679評論 0 19
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,265評論 0 16
  • “我最幸福的時(shí)候就是抱著你睡著娩井, 可是暇屋, 我卻不能知道這幸福的滋味, 想想也是蠻傷的洞辣, 很多個(gè)這樣的清晨我睜開雙眼...
    假面唐七閱讀 272評論 0 1
  • 那天姐姐告訴我扬霜,她這邊有好的工作問我和妹妹想不想來定鸟。我猶豫了很久,暫時(shí)沒回復(fù)姐姐著瓶。從畢業(yè)之后我就一直在外面游蕩联予,一...
    吟水萊閱讀 247評論 0 3