如何保證HashMap不重建Hash表

如何保證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表不被重建。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章