HashMap初始化長度設置大小

HashMap的優化點,創建HashMap時,如果已經知道大概要放多少的數據量,可以自己設置好長度,減少擴容,提高速度。
代碼比較,存放3個數。
不設置初始化大小

private static void test1(){
		long l1 = System.nanoTime();
		Map<String,String> dataMap = new HashMap<>();
		dataMap.put("1", "A");
		dataMap.put("2", "B");
		dataMap.put("3", "C");
		long l2 = System.nanoTime();
		System.out.println("花費時間納秒:"+(l2-l1));
	}

設置初始化大小

	private static void test2(){
		long l1 = System.nanoTime();
		Map<String,String> dataMap = new HashMap<>(4);
		dataMap.put("1", "A");
		dataMap.put("2", "B");
		dataMap.put("3", "C");
		long l2 = System.nanoTime();
		System.out.println("花費時間納秒:"+(l2-l1));
	}

查看兩者的時間差,單位是納秒

多次運行結果,發現設置了長度時,花費的時間短了許多,大概是不設置的1/3

存放10萬條數據比較二者耗時,大概是不設置長度的時間的一半


那麼有個問題了,如果創建HashMap是,傳了長度參數5?那它的長度就是5麼?,首先看下一下HashMap的構造函數

可以看到有3個構造方法,無參構造函數,我們知道默認的長度是16

    /**
     * The default initial capacity - MUST be a power of two.
     * 默認初始容量-必須是2的冪。
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

只有一個參數的就是可以自定義初始map的長度,若果我們傳的參數是5,那麼map的長度就是5嗎?

答案是NO,記着看這句話,默認初始容量-必須是2的冪。如果傳的參數是5,hashmap底層會自動幫我們優化成比5大的2的倍數的最小值,也就是2的3次方8。源碼如下

Returns a power of two size for the given target capacity.
 

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