2016-12-25 62 views
-1

我想用500個元素初始化一個HashMap,全部設置爲零。我嘗試使用Lambda forEach循環,但即使完成了lambda循環,映射的大小仍然爲零。 我很想知道內存什麼時候分配給put操作。內存什麼時候分配給HashMap元素?

Map<Integer, Integer> map = new HashMap<>(500); 

map.keySet().forEach(i -> map.put(i, new Integer(0))); 

System.out.println("Size of the HashMap using Lambda forEach loop: " + map.size()); 

for (int i=0; i < 500; i ++){ 
    map.put(i,0); 
} 

System.out.println("Size of the HashMap using regular for loop: " + map.size()); 

輸出:

Size of the HashMap using Lambda forEach loop: 0 
Size of the HashMap using regular for loop: 500 

PS:我知道有使用Java8另一種方法爲流將元素添加到HashMap的,但我更想知道put操作。

+0

您正在迭代地圖的按鍵,但尚未將任何東西放入地圖。所以keySet是空的。什麼令人驚訝? –

+0

如果地圖不是空的,在迭代時調用'put'必須被認爲是中斷的。另外,新的Integer(0)'有什麼意義? – Holger

+0

注意HashMap 中的鍵可以是任何整數,不只是0..N-1;例如他們完全可以是1000100 1000503 1001002 1001501等等。如果你的密鑰總是0..N-1,你可以使用(內置)數組或ArrayList來獲得比HashMap更好的效率。 –

回答

4
Map<Integer, Integer> map = new HashMap<>(500); 

將創建的500

因此map.keySet()初始容量的空地圖返回一個空SetforEach調用不起任何作用。

我很想知道當內存被分配給put操作

每當你在Map(這是不是已經在Map即鍵)把一個新的密鑰,一個新的Map.Entry實例已創建。這是內存分配的時間。

實例化HashMap與給定的容量僅分配用於初始陣列將保存Map的條目(甚至不一定是真實的,因爲陣列的分配可以懶惰)的存儲器。

+0

謝謝你的簡單解釋。 –