實驗證明:HashMap設置初始大小,真的能提高效率嗎

在《阿里巴巴Java開發手冊v1.3.0》一、編程規約 – (五)集合處理 – 第九條的規範裏,集合初始化時,指定集合初始值大小。因爲HashMap在自動擴容時會消耗時間,網上也大多也都同意,也相應的做了很多demo證明這個理論。但是最近做了相關的demo,發現集合初始化大小,並不能提升效率,以下會貼出我的demo和我的疑問,歡迎大家來指正。測試工具Eclipse、jdk8

public static void main(String[] args) {
		int aHundredMillion = 1000000;
		
		Map<Integer, Object> map = new HashMap<>();

		long s1 = System.currentTimeMillis();
		for (int i = 0; i < aHundredMillion; i++) {
			map.put(i, i);
		}
		long s2 = System.currentTimeMillis();

		System.out.println("未初始化容量,耗時 : " + (s2 - s1));
		
		
		Map<Integer, Integer> map1 = new HashMap<>(aHundredMillion / 2);

		long s5 = System.currentTimeMillis();
		for (int i = 0; i < aHundredMillion; i++) {
			map1.put(i, i);
		}
		long s6 = System.currentTimeMillis();

		System.out.println("初始化容量500000,耗時 : " + (s6 - s5));
		
		
		Map<Integer, Object> map2 = new HashMap<>(aHundredMillion/3*4+1);

		long s3 = System.currentTimeMillis();
		for (int i = 0; i < aHundredMillion; i++) {
			map2.put(i, i);
		}
		long s4 = System.currentTimeMillis();

		System.out.println("初始化容量爲標準容量,耗時 : " + (s4 - s3));
		
	}

上面是一個很簡單的demo,依次打印出:1.未初始化容量的耗時 2.初始化容量500000的耗時 3.初始化容量爲標準容量的耗時(大小/3*4+1),以下結果都是多次執行,耗時結果都幾乎不差多少
樣本數據爲1000000的結果爲(順序記爲1、2、3):

未初始化容量,耗時 : 94
初始化容量500000,耗時 : 69
初始化容量爲標準容量,耗時 : 24

從上面的結果可以看出初始化爲標準容量耗時是最小的,網上也大多是這樣的結果,但是調整順序執行了一遍,發現了不一樣的結果,同樣是樣本數據爲1000000的結果爲:

初始化容量爲標準容量,耗時 : 95
初始化容量500000,耗時 : 90
未初始化容量,耗時 : 30

然而在3、2、1的順序的情況下,未初始化容量的耗時卻是最小的。

上訴的執行結果都是在以一個main方法,現在分別對着三種情況執行。

1.未初始化容量,耗時 : 102
2.初始化容量500000,耗時 : 106
3. 初始化容量爲標準容量,耗時 : 100

分別對以上三種情況分別做多次執行,發現耗時時間差不多。到底爲什麼呢?又猜測是不是的存儲數據達到一定數量會導致初始化值並不會提高效率?因爲設置初始化值也得花費時間。而且驗證過在一千萬的情況下,分別執行:初始化大小的時間要比未初始化的時間要耗時很多

樣本數據爲10000的結果爲(順序記爲3、2、1):

初始化容量爲標準容量,耗時 : 4
初始化容量500000,耗時 : 2
未初始化容量,耗時 : 2

樣本數據爲10000,分別執行三種情況:

  1. 初始化容量爲標準容量,耗時 : 2或3
    2.初始化容量500000,耗時 : 2 或3
    3.未初始化容量,耗時 : 2或3

樣本數據爲1000,執行的情況都是低於1毫秒,所有沒有統計出來。

之後還使用Idea,jdk7測試過結果基本一樣。最後通過實驗總結了一些結果:
1.當數據量很大的情況,初始化大小會比爲未初始化大小更耗時(當然實際開發中也很少有向map裏放入千萬的map)
2.初始化map的大小並不能提高效率,(該結論只是適用在毫秒級的,如果更精細的時間沒有做驗證,故此不是很嚴謹)
3. 在同一個方法內有多個Map,第一個map會比較好耗時,之後的map效率會高點(具體原因還沒有想明白)

以上結論只是本人觀點,如有錯誤歡迎指正,避免誤導他人!

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