Java 什么时候为HashMap元素分配内存?

Java 什么时候为HashMap元素分配内存?,java,hashmap,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

我试图初始化一个包含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());
Map<Integer, Integer> map = new HashMap<>(500);
PS:我知道还有另一种使用Java8 streams向hashmap添加元素的方法,但我更感兴趣的是了解put操作。

Map Map=newHashMap(500);
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());
Map<Integer, Integer> map = new HashMap<>(500);
创建初始容量为500的空映射

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

我很想知道什么时候为put操作分配内存

每当您在
映射
中放入一个新的键(即
映射
中不存在的键),就会创建一个新的
映射条目
实例。这就是内存分配的时间


用给定的容量实例化
HashMap
,只会为初始数组分配内存,该数组将保存
Map
的条目(甚至这也不一定是真的,因为数组的分配可能是惰性的)。

您正在迭代映射的键,但还没有在映射中放入任何内容。因此键集是空的。有什么奇怪的?如果映射不是空的,那么在对其进行迭代时调用
put
必须被视为已断开。此外,
新整数(0)
的意义是什么?注意HashMap中的键可以是任何整数,而不仅仅是0..N-1;例如,它们很可能是1000100 1000503 1001002 1001501等。如果您的密钥始终为0..N-1,则可以使用(内置)数组或ArrayList,以获得比HashMap更高的效率。感谢您的简单解释。