JDK原始碼學習 HashMap(一)

2021-09-10 18:11:19 字數 2385 閱讀 4408

public class hashmapextends abstractmapimplements map, cloneable

, serializable

{}

類定義:hashmap繼承了abstractmap,實現map,cloneable,serializable 介面

abstractmap:  實現了一些方法,這裡不做解釋;

cloneable:是乙個標識介面,(應該是表示實現它的類允許被複製之類的。。。。)

構造方法:

/**

initialcapacity : map的初始容量

loadfactor :載入因子/係數

*/public hashmap(int initialcapacity, float loadfactor)

/** 設定初始容量

使用預設載入因子初始化map,預設為0.75

*/public hashmap(int initialcapacity)

/** 使用預設容量和載入因子初始化map

*/public hashmap()

/** 將map作為模板引數直接匯入本hashmap

*/public hashmap(map extends k, ? extends v> m)

類成員:

//預設的初始容量大小 16

static final int default_initial_capacity = 1 << 4;

//hashmap的最大容量 1073741824

static final int maximum_capacity = 1 << 30;

//預設載入因子

static final float default_load_factor = 0.75f;

//使用紅黑樹替代鍊錶的閾值,>= 這個閾值鍊錶將轉化為紅黑樹

static final int treeify_threshold = 8;

//當同乙個桶上鍊表節點<= 6時,紅黑樹將轉化為鍊錶,反轉

static final int untreeify_threshold = 6;

//hashmap可以將鍊錶轉化為樹結構的最小閾值,也就是要達到64個桶位,才會開啟轉化

static final int min_treeify_capacity = 64;

//儲存鍵值對資料

transient set> entryset;

//本hashmap中鍵值對數量

transient int size;

//此hashmap中結構變化的次數,改動次數

transient int modcount;

//如果初始化沒有給hashmap分配桶容量大小,則這裡儲存的是預設大小default_initial_capacity值

int threshold;

//這個儲存的也是載入因子,而default_load_factor 是沒有指定情況下預設的載入因子

final float loadfactor;

下面看下hashmap的資料結構

transient node table;

static class nodeimplements map.entry

可以看出,hashmap基本結構是由陣列+鍊錶形式,如上圖 array [1]  所示

陣列中每個元素都是node型別,也就是鍵值對形式

static class nodeimplements map.entry
也就是說,node陣列每個元素都可以容納一條鍊錶,該元素就是它容納的鍊錶的頭節點,通過訪問它的next屬性,就可以遍歷該鍊錶所有元素。

主要看下節點類的3個方法

/**

獲取該節點的hash值

key的hash 和 value的hash 用按位異或運算

*/public final int hashcode()

/**給該節點設定新值,返回原來的值

*/public final v setvalue(v newvalue)

/**比較node節點物件內容是否相同

*/public final boolean equals(object o)

return false;

}

JDK原始碼學習 HashMap

什麼是hash?hash的意思是 雜湊 音譯做 雜湊 輸入乙個任意長度的資料,進過雜湊運算之後,輸出一段固定長度的資料,作為輸入資料的指紋,輸出的結果就是雜湊值。一般來說輸入資料的空間遠遠大於輸出的雜湊值的空間,輸入不同的資料可能會產生相同的雜湊值,所以很難從雜湊值來逆向推出輸入值是什麼。雜湊函式本...

JDK原始碼學習01 HashMap原始碼學習

hashmap中直接注意的細節 紅黑樹長度小於閾值 yu 4聲 6轉化成兩邊 鍊錶長度大於閾值8 且table的長度大於等於64 才樹化 僅滿足鍊錶長度大於閾值8只會呼叫resize擴容 為什麼是6和8呢,而不設定成一樣呢,因為為了防止在邊界反覆橫跳,浪費效能if tab null n tab.le...

JDK原始碼之HashMap

部分重要屬性 存放key,value的陣列 transient node table 存放entry的set transient set entryset hashmap的大小 預設16 transient int size 修改次數 transient int modcount 擴擴容閾值capa...