我正在尝试使用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操作。
答案 0 :(得分:4)
Map<Integer, Integer> map = new HashMap<>(500);
创建一个初始容量为500的空Map。
因此,map.keySet()
会返回一个空的Set
,而forEach
调用则不会执行任何操作。
我很想知道何时将内存分配给put操作
每当您在Map
中放入一个新密钥(即Map
中尚未包含的密钥)时,都会创建一个新的Map.Entry
实例。那就是分配内存的时候。
使用给定容量实例化HashMap
仅为将保存Map
条目的初始数组分配内存(甚至不一定如此,因为数组的分配可以懒惰)。