自己實(shí)現(xiàn)hashmap HashMap的內(nèi)部實(shí)現(xiàn)機(jī)制,Hash是怎樣實(shí)現(xiàn)的,什么時候ReHash?
HashMap的內(nèi)部實(shí)現(xiàn)機(jī)制,Hash是怎樣實(shí)現(xiàn)的,什么時候ReHash?此實(shí)現(xiàn)假定哈希函數(shù)在bucket之間正確地分配元素,這可以為基本操作(get和put)提供穩(wěn)定的性能。迭代集合視圖所需的時間與
HashMap的內(nèi)部實(shí)現(xiàn)機(jī)制,Hash是怎樣實(shí)現(xiàn)的,什么時候ReHash?
此實(shí)現(xiàn)假定哈希函數(shù)在bucket之間正確地分配元素,這可以為基本操作(get和put)提供穩(wěn)定的性能。迭代集合視圖所需的時間與HashMap實(shí)例的“容量”(bucket數(shù))及其大?。ㄦI值映射數(shù))成比例。因此,如果迭代性能很重要,不要將初始容量設(shè)置得太高(或負(fù)載系數(shù)太低)。
HashMap實(shí)例有兩個影響其性能的參數(shù):初始容量和加載因子。容量是哈希表中的存儲桶數(shù),初始容量只是創(chuàng)建哈希表時的容量。負(fù)載因子是哈希表在容量自動增加之前的滿度。當(dāng)哈希表中的條目數(shù)超過加載因子和當(dāng)前容量的乘積時,哈希表將被重新哈希(即,重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),這樣哈希表將具有大約兩倍的bucket數(shù)。
如何讓HashMap變成線程安全的?
有兩種方法可以使HashMap線程安全,如下所示:方法1:通過集合.synchronizedMap()返回線程安全的新映射。這要求我們習(xí)慣于基于接口的編程,因?yàn)槲覀兎祷氐牟皇荋ashMap,而是map實(shí)現(xiàn)。方法2:重寫HashMap,可以看到細(xì)節(jié)java.util.concurrent文件. 并發(fā)哈希映射。這種方法比方法一好得多。