何时为HashMap元素分配内存?

时间:2016-12-25 14:37:57

标签: java hashmap

我正在尝试使用500个元素初始化HashMap,所有元素都设置为零。我尝试使用Lambda forEach循环,但即使在完成lambda循环后,映射的大小仍然为零。 我很想知道何时为put操作分配了内存。

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操作。

1 个答案:

答案 0 :(得分:4)

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

创建一个初始容量为500的空Map。

因此,map.keySet()会返回一个空的Set,而forEach调用则不会执行任何操作。

  

我很想知道何时将内存分配给put操作

每当您在Map中放入一个新密钥(即Map中尚未包含的密钥)时,都会创建一个新的Map.Entry实例。那就是分配内存的时候。

使用给定容量实例化HashMap仅为将保存Map条目的初始数组分配内存(甚至不一定如此,因为数组的分配可以懒惰)。