HashSet HashMap 原始碼閱讀筆記

2022-08-23 10:36:10 字數 1910 閱讀 3388

hashcode() 與 equals() 應一起重寫,在hashmap 會先呼叫hash(key.hashcode()) 找到對應的entry陣列位置 (一般初始是16,2^x,rehash後會翻倍),再在這個entry鍊錶上equals判斷是否存在相同元素。

所以當重寫equals時沒保證hashcode出的值的一致性,會導致hash到不同的陣列位置 插入重複的元素。

※string類的hashcode是通過各個位置的char的ascii碼計算σx*31^(len-i)得到的※

hashset通過hashmap實現,其中每次插入的value值都是乙個object的常量。iterator()返回map的hashmap的keyiterator。

hashmap成員變數

1

//預設初始化map的容量:16

2static

final

int default_initial_capacity = 1 << 4;3//

map的最大容量:2^30

4static

final

int maximum_capacity = 1 << 30;5//

預設的填充因子:0.75,能較好的平衡時間與空間的消耗

6static

final

float default_load_factor = 0.75f;7//

將鍊錶(桶)轉化成紅黑樹的臨界值

8static

final

int treeify_threshold = 8;9//

將紅黑樹轉成鍊錶(桶)的臨界值

10static

final

int untreeify_threshold = 6;

11//

轉變成樹的table的最小容量,小於該值則不會進行樹化

12static

final

int min_treeify_capacity = 64;

13//

上圖所示的陣列,長度總是2的冪次

14transient node table;

15//

map中的鍵值對集合

16transient set>entryset;

17//

map中鍵值對的數量

18transient

intsize;

19//

用於統計map修改次數的計數器,用於fail-fast丟擲concurrentmodificationexception

20transient

intmodcount;

21//

大於該閾值,則重新進行擴容,threshold = capacity(table.length) * load factor

22int

threshold;

23//

填充因子

24final

float loadfactor;

長度為2^n是取模運算快,只需要&(size-1)即可

jdk1.8中 桶中 如果鍊錶長度超過8 會重拍成紅黑樹,依照hashcode值排序

總數量超過threshold = capacity * loadfactor 會進行resize重拍。需要遍歷整個table,效能較低,如果提前知道map大小,最好在初始化的時候提前設定。

在使用iterator迭代器遍歷(for each)的時候如果在遍歷途中刪除map中元素,會丟擲concurrentmodificationexception(!!刪除倒數第二個不會報錯),最好使用iterator內部的刪除方法iterator.remove()

hashmap允許key和value為null,執行緒不安全

HashSet HashMap 訪問值的過程

1 hashset底層用的是hashmap來實現的 2 這個hashmap的key就是放進hashset中的物件,value就是乙個object型別的物件 3 當呼叫hashset的方法時,實際上是向hashmap中增加了乙個鍵值對,key就是set增加的那個物件,value是乙個object型別的...

官方源 映象源彙總

網易 http 阿里雲 http 上海交通大學 http ftp.sjtu.edu.cn html resources.xml 部分移動運營商出口狀況不佳,無法訪問 華中科技大學 http mirror.hust.edu.cn 當前已用容量估計 4.83t 清華大學 http mirrors.tun...

官方源 映象源彙總

網易 阿里雲 上海交通大學 部分移動運營商出口狀況不佳,無法訪問 華中科技大學 當前已用容量估計 4.83t 清華大學 當前已用容量估計 9.8t 北京理工大學 蘭州大學 中國科技大學 當前已用容量估計 21.32t 大連東軟資訊學院 當前已用容量估計 2.5t 東北大學 大連理工大學 哈爾濱工業大...