HashMap原始碼分析jdk1 8

2022-03-21 12:37:15 字數 2596 閱讀 7436

hashmap作為一種最常用的集合型別之一,他的實現是用的雜湊表,在這就不進行雜湊表詳細的解釋。為解決雜湊表的衝突問題,hashmap即是採用了鏈位址法,也就是陣列+鍊錶的方式。廢話不多說,我們還是通過原始碼來進行hashmap的詳解。

組成hashmap的基本單元node節點

/**

*node節點的定義

*/static

class nodeimplements map.entry

}

而為了實現鍊錶加陣列的結構,它定義了這麼乙個變數 transient node table;  這個變數其實就代表了hashmap的主體,接下來看下他如何實現hashmap的功能。讓我們再來看hashmap的原始碼

hashmap中定義了這麼幾個常量,正如他的注釋所講。在這就不行翻譯了。

/**

* the default initial capacity - must be a power of two.

*/static

final

int default_initial_capacity = 1 << 4; //

aka 16

/*** the maximum capacity, used if a higher value is implicitly specified

* by either of the constructors with arguments.

* must be a power of two <= 1<<30.

*/static

final

int maximum_capacity = 1 << 30;

/*** the load factor used when none specified in constructor.

*/static

final

float default_load_factor = 0.75f;

了解這些我們再來看hashmap的主要**

final v putval(int hash, k key, v value, boolean

onlyifabsent,

boolean

evict)

if (e.hash == hash &&((k = e.key) == key || (key != null &&key.equals(k))))

break

; p =e;}}

if (e != null)

}++modcount;

if (++size >threshold)

resize();

afternodeinsertion(evict);

return

null

; }

/*** initializes or doubles table size. if null, allocates in

* accord with initial capacity target held in field threshold.

* otherwise, because we are using power-of-two expansion, the

* elements from each bin must either stay at same index, or move

* with a power of two offset in the new table.**

@return

the table

*/final node resize()

else

if ((newcap = oldcap << 1) < maximum_capacity &&oldcap >=default_initial_capacity)

newthr = oldthr << 1; //

double threshold

}

else

if (oldthr > 0) //

initial capacity was placed in threshold

newcap =oldthr;

else

if (newthr == 0)

threshold =newthr;

@suppresswarnings()

node

newtab = (node)new

node[newcap];

table =newtab;

if (oldtab != null

)

else

} while ((e = next) != null

);

if (lotail != null

)

if (hitail != null

) }}}

}return

newtab;

}

分析HashMap 的 JDK 原始碼

緣由 今天好友拿著下面的 問我為什麼 map.entry 這個介面沒有實現 getkey 和 getvalue 方法,卻可以使用,由此,開啟了一番查閱 jdk 原始碼的旅途 map map new hashmap map.put 1,張三 map.put 2,李四 map.put 3,王五 map....

hashmap原始碼分析jdk8

最近看了下jdk8的hashmap原始碼,相比於7,在儲存結構上有了些改變。1.在jdk8之前,hashmap的儲存結構是陣列 鍊錶的形式,那麼這種方式隨著鍊錶的長度增加,效率也凸顯出來。所以在jdk8中這塊做了優化,當鍊表超過一定長度時轉化為紅黑樹來解決這個問題,下面用流程圖畫出hashmap 的...

HashMap原始碼分析 JDK1 8

陣列 鍊錶 紅黑樹 陣列儲存元素,當有衝突時,就在該陣列位置形成乙個鍊錶,儲存衝突的元素,當鍊表元素個數大於閾值時,鍊錶就轉換為紅黑樹。transient node table transient int size int threshold final float loadfactor 預設初始容...