如何保證HashMap不重建Hash表
在《阿里巴巴java開發規約》裏面,有推薦在初始化HashMap的時候指定初始化長度,尤其是已經知道結果的key數量的時候
當元素個數 >= initialCapacity * loaderFactor
的時候,HashMap就會自行進行擴容到 大於當前容量的下一個 2 的冪,重建 Hash表會影響性能,那麼如何保證Hash表不被重建呢? 先看一段代碼。
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class HashMapTest {
public static void main(String[] args) throws Exception {
//假設我們知道返回結果的元素個數爲 100,即可這樣寫代碼
int num = 10;
// HashMap 的負載因子默認爲 0.75
float loadFactor = 0.75f;
Map<String, Object> map = new HashMap<String,Object>((int)(num/0.75f),loadFactor);
//使用反射機制查看 capacity 屬性
Class<?> mapType = map.getClass();
Method capacity = mapType.getDeclaredMethod("capacity");
capacity.setAccessible(true);
int times = num;
for (int i=0;i< times;i++){
map.put(""+i,i);
System.out.println("capacity "+i+":"+capacity.invoke(map));
}
}
}
輸出結果
capacity 0:16
capacity 1:16
capacity 2:16
capacity 3:16
capacity 4:16
capacity 5:16
capacity 6:16
capacity 7:16
capacity 8:16
capacity 9:16
可見,capacity
一直都沒變,因此最重要的是初始化時將初始容量設爲(int)(num/loadFactor)
即可保證Hash表不被重建。