Hashmap 與 jdk1.8中對(duì)hash算法和尋址算法是如何優(yōu)化的猎拨?

一、HashMap

數(shù)組+最簡單的原理

[<張三屠阻,32歲>红省,<李四,54歲>] —>數(shù)組

對(duì)key計(jì)算出一個(gè)hash值国觉,根據(jù)這個(gè)hash值對(duì)數(shù)組進(jìn)行取模吧恃,也就是index,定位到數(shù)組里的元素中去

map.get(“張三“) —> hash值 —> 對(duì)數(shù)組長度進(jìn)行取模 —> return array[1]

Array[1]= <李四,54歲>

二麻诀、jdk1.8中對(duì)hash算法和尋址算法

1痕寓、hash值進(jìn)行右移 16位,把2進(jìn)制往右邊推16位蝇闭,把高16位推到低16位上來呻率,前面用0來補(bǔ)齊,然后原來的hash值 與 右移出來的hash值 進(jìn)行異或? ? 異或出來的hash值包含了高16位與低16位hash值得特征呻引。使高低16位都參與了運(yùn)算


異或出來的? hash值? 就是一個(gè)32位的 int值

異或? 兩個(gè)一樣? 是0礼仗;? ? 兩個(gè)不一樣 是1?

如 1? 0

? ? 1? 1

? ? 0? 1

數(shù)組—> hash值對(duì)數(shù)組長度取模,定位到數(shù)組的一個(gè)位置

2逻悠、優(yōu)化地方元践,尋址算法優(yōu)化

(n-1)& hash —> 數(shù)組里的一個(gè)位置

取模運(yùn)算,他是性能比較差童谒,為了優(yōu)化這個(gè)數(shù)組尋址的過程

(n-1)& hash —>效果要跟hash對(duì)n取模单旁,效果是一樣的,但是與運(yùn)算的性能要比hash對(duì)n取模要高很多

總結(jié)jdk1.8中對(duì)hash算法和尋址算法是如何優(yōu)化的饥伊?

1象浑、hash算法的優(yōu)化:對(duì)每個(gè)hash值蔫饰,在他的低16位中,讓高低16位進(jìn)行異或融柬,讓他的低16位同時(shí)保持了高低16位的特征死嗦,盡量避免一些hash值后續(xù)出現(xiàn)沖突趋距,大家可能會(huì)進(jìn)入數(shù)組的同一個(gè)位置粒氧。

2、尋址算法的優(yōu)化:用與運(yùn)算替代取模节腐,提升性能外盯。


三、解決hash沖突問題翼雀,鏈表+紅黑樹饱苟,O(n)和O(logn)

map.put 和 map.get —> hash算法優(yōu)化(避免hash沖突),尋址性能優(yōu)化

算出key 的hash值狼渊,到數(shù)組中尋址箱熬,找到一個(gè)位置,把key-value對(duì)放進(jìn)數(shù)組狈邑,或從數(shù)組里取出來

兩個(gè)key? 多個(gè)key 城须,他們算出來的hash值,與n-1 米苹,與運(yùn)算后糕伐,發(fā)現(xiàn)定位出來的數(shù)組的位置還是一樣的,hash碰撞蘸嘶,hash沖突

會(huì)在這位置掛一個(gè)鏈表良瞧,這個(gè)鏈表里放入多個(gè)元素,讓多個(gè)key-value 對(duì)训唱,同時(shí)放在數(shù)組的一個(gè)位置離

get褥蚯,如果定位到這個(gè)數(shù)組里發(fā)現(xiàn)這個(gè)位置掛了一個(gè)鏈表,此時(shí)遍歷鏈表况增,找到你要的key-value對(duì)就可以了

假設(shè)這個(gè)鏈表很長赞庶,可能會(huì)導(dǎo)致遍歷鏈表,性能會(huì)比較差? O(n)

優(yōu)化巡通,如果鏈表的長度達(dá)到了一定的長度之后尘执,其實(shí)會(huì)把鏈表轉(zhuǎn)換為紅黑樹,遍歷一顆紅黑樹找到一個(gè)元素宴凉,此時(shí)O(logn)誊锭,性能會(huì)比鏈表高一些

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弥锄,隨后出現(xiàn)的幾起案子丧靡,更是在濱河造成了極大的恐慌蟆沫,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件温治,死亡現(xiàn)場(chǎng)離奇詭異饭庞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)熬荆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門舟山,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卤恳,你說我怎么就攤上這事累盗。” “怎么了突琳?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵若债,是天一觀的道長。 經(jīng)常有香客問我拆融,道長蠢琳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任镜豹,我火速辦了婚禮傲须,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逛艰。我一直安慰自己躏碳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布散怖。 她就那樣靜靜地躺著菇绵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镇眷。 梳的紋絲不亂的頭發(fā)上咬最,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音欠动,去河邊找鬼永乌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛具伍,可吹牛的內(nèi)容都是我干的翅雏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼人芽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼望几!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起萤厅,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤橄抹,失蹤者是張志新(化名)和其女友劉穎靴迫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楼誓,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玉锌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疟羹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片主守。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阁猜,靈堂內(nèi)的尸體忽然破棺而出丸逸,到底是詐尸還是另有隱情,我是刑警寧澤剃袍,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站捎谨,受9級(jí)特大地震影響民效,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涛救,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一畏邢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧检吆,春花似錦舒萎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摊灭,卻和暖如春咆贬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帚呼。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工掏缎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煤杀。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓眷蜈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沈自。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酌儒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • HashMap眾所周知其是以數(shù)組為最底層的數(shù)據(jù)結(jié)構(gòu),在默認(rèn)初始長度為16的數(shù)組中酥泛,以計(jì)算hash值跟長度取模定位在...
    顧城猶夢(mèng)閱讀 554評(píng)論 0 0
  • 一今豆、數(shù)據(jù)結(jié)構(gòu) HashMap是高效的查詢?nèi)萜飨蛹穑讓拥臄?shù)據(jù)結(jié)構(gòu)是數(shù)組 + 鏈表 + 紅黑樹。查詢可以計(jì)算hash結(jié)果...
    MuziBlogs閱讀 326評(píng)論 0 0
  • 簡介 HashMap是Java程序員使用頻率最高的用于映射(鍵呆躲、值對(duì))處理的數(shù)據(jù)類型异逐,它根據(jù)鍵的hashCode值...
    lisnail閱讀 120評(píng)論 0 0
  • 前言 本文主要講解HashMap的底層數(shù)據(jù)結(jié)構(gòu)、存取原理插掂、擴(kuò)容機(jī)制灰瞻、線程安全性、java 7 和java 8版本的...
    markeNick閱讀 641評(píng)論 0 2
  • 背景 無論在HashMap中進(jìn)行查找辅甥、插入還是刪除操作酝润,都需要計(jì)算key的hashCode(),然后根據(jù)hashc...
    袁小象閱讀 1,798評(píng)論 0 0