摘要:源碼解析的數(shù)據(jù)存儲結(jié)構(gòu)中的都是存在數(shù)組中的數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)是一個單向的鏈表,,實(shí)現(xiàn)了的接口,即實(shí)現(xiàn)了,,等這些函數(shù),這些都是基本的讀取修改值的函數(shù)。的作用是判斷是否包含的作用是判斷是否包含值為的元素
HashMap源碼解析 hashmap的數(shù)結(jié)構(gòu)
(1)在Java中,數(shù)據(jù)結(jié)構(gòu)分為兩種,一種是數(shù)組,另一個是模型指針即引用,所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩種基本結(jié)構(gòu)所構(gòu)造,HashMap就是一個數(shù)組和鏈表的結(jié)合體,即通過hashcode找到數(shù)組中的某一個元素,然后通過key的equals方法在鏈表中找到key的位置對應(yīng)的value。 (2)當(dāng)創(chuàng)建一個hashmap的時候,就會初始化一個entry的數(shù)組,每一個entry的數(shù)組元素會持有一個指向下一個元素的引用,這就構(gòu)成了鏈表。當(dāng)我們往hashmap中put元素的是時候,先跟住key的hash值得到這個元素在數(shù)組中的位置(即下標(biāo))然后可以把這個元素放在對應(yīng)的位置之中了,如果這個位置繼續(xù)放其他的元素,那么在同一個位子上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的就會放在鏈未,從hashmap之中g(shù)et元素的時候,首先計算hashmap的key值得hashcode,找到數(shù)組中對應(yīng)位置的某一個元素,然后通過key的equals方法在對應(yīng)的位置的鏈表中找到需要的元素,其實(shí)也就是說,如果每一個鏈表的位置只有一個元素,那么hashmap的get的效率是最高的。hash算法
(1)首先先算的key的hashcode的值,然后和數(shù)組長度-1做一次&,這樣就可以保證得到與數(shù)組index相同的幾率較小,那么數(shù)據(jù)在數(shù)組上分布的就比較均勻,也就是碰撞率較小,響應(yīng)的提高了查詢的效率。
hashmap的擴(kuò)容(1)當(dāng)hashmap中的元素越來越多的時候,碰撞的幾率就會直線上升,為了提高查詢的效率,就要對hashmap的數(shù)組進(jìn)行擴(kuò)容,而在hashmap數(shù)組擴(kuò)容時候,原數(shù)組中的數(shù)據(jù)必須重新計算其在新數(shù)組中的位置,并放進(jìn)去,這個過程叫resize,而這個過程十分耗時,所以說,盡量在聲明的時候,就定義它的大小。hashmap 源碼解析
(1)hashmap的數(shù)據(jù)存儲結(jié)構(gòu)
transient Entry[] table hashmap中的key-value都是存在entry數(shù)組中的
(2)數(shù)據(jù)節(jié)點(diǎn)entry的數(shù)據(jù)結(jié)構(gòu)
entry是一個單向的鏈表,entr,實(shí)現(xiàn)了map.entry 的接口,即實(shí)現(xiàn)了getkey(),getvalue(),setvalue() ,equals(),hashcode()等這些函數(shù),這些都是基本的讀取/修改key、value 值的函數(shù)。
(3)hashmap的構(gòu)造函數(shù)
(1. 默認(rèn)構(gòu)造函數(shù) hashmap(); (2. 指定容量大小和加載因子的構(gòu)造函數(shù) hashmap(int initalcapaciry,float loadFactor) (3. 指定容量大小的構(gòu)造函數(shù) hashmap(int initialcapacity) (4. 包含map的構(gòu)造函數(shù) hashmap(map extends K,? extends V> m)
(4) clear()
clear()的作用是清空hashmap,它是通過將所有的元素設(shè)置為null來實(shí)現(xiàn)的。
(5)containsKey()
containsKey()的作用是判斷hashmap是否包含key
(6)containsValue()
containsValue()的作用是判斷hashmap是否包含值為value的元素
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/71220.html
摘要:當(dāng)一個值中要存儲到的時候會根據(jù)的值來計算出他的,通過哈希來確認(rèn)到數(shù)組的位置,如果發(fā)生哈希碰撞就以鏈表的形式存儲在源碼分析中解釋過,但是這樣如果鏈表過長來的話,會把這個鏈表轉(zhuǎn)換成紅黑樹來存儲。 正文開始 注:JDK版本為1.8 HashMap1.8和1.8之前的源碼差別很大 目錄 簡介 數(shù)據(jù)結(jié)構(gòu) 類結(jié)構(gòu) 屬性 構(gòu)造方法 增加 刪除 修改 總結(jié) 1.HashMap簡介 H...
摘要:簡介繼續(xù)分析源碼,上一篇文章把的分析完畢。本文開始分析簡單的介紹一下。存儲的元素是無序的并且允許使用空的元素。 1.簡介 繼續(xù)分析源碼,上一篇文章把HashMap的分析完畢。本文開始分析HashSet簡單的介紹一下。 HashSet是一個無重復(fù)元素集合,內(nèi)部使用HashMap實(shí)現(xiàn),所以HashMap的特征耶繼承了下來。存儲的元素是無序的并且HashSet允許使用空的元素。 HashSe...
摘要:則使用了拉鏈?zhǔn)降纳⒘兴惴?,并在中引入了紅黑樹優(yōu)化過長的鏈表。如果大家對紅黑樹感興趣,可以閱讀我的另一篇文章紅黑樹詳細(xì)分析。構(gòu)造方法構(gòu)造方法分析的構(gòu)造方法不多,只有四個。 1.概述 本篇文章我們來聊聊大家日常開發(fā)中常用的一個集合類 - HashMap。HashMap 最早出現(xiàn)在 JDK 1.2中,底層基于散列算法實(shí)現(xiàn)。HashMap 允許 null 鍵和 null 值,在計算哈鍵的哈希值...
摘要:線程安全關(guān)于線程安全,我們想要知道的是在什么情況下會發(fā)生線程不安全的情況實(shí)際上,在上文分析方法時,當(dāng)?shù)娜萘砍^了時,便執(zhí)行操作,就存在線程不安全的問題。實(shí)現(xiàn)了所謂的線程安全,在很多方法上都加上了。 HashMap簡介 本文針對HashMap的源碼分析基于JDK 7,JDK 8在HashMap的實(shí)現(xiàn)上有著較大幅度的改進(jìn)和優(yōu)化,這部分優(yōu)化我將另起一篇來闡述。另外,本文僅分析HashMap眾...
閱讀 1334·2021-09-01 10:30
閱讀 2263·2021-07-23 10:38
閱讀 968·2019-08-29 15:06
閱讀 3213·2019-08-29 13:53
閱讀 3325·2019-08-26 11:54
閱讀 1900·2019-08-26 11:38
閱讀 2436·2019-08-26 10:29
閱讀 3190·2019-08-23 18:15