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