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, booleanonlyifabsent,
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 預設初始容...