繁体   English   中英

为什么此代码会在线程“main”java.lang.OutOfMemoryError: Java heap space 中抛出异常?

[英]Why does this code throw Exception in thread "main" java.lang.OutOfMemoryError: Java heap space?

import java.util.HashMap;
import java.util.HashSet;

public class ComputeIfAbsentWithHashSetNew {
    public static void main(String[] args) {
        var map = new HashMap<Integer, HashSet<Integer>>();
        var data = new int[][]{{305589003, 4136}, {305589004, 4139}};
        for (var entry : data) {
            int x = entry[0];
            int y = entry[1];
//            map.computeIfAbsent(x, _x -> new HashSet<>()).add(y); // ----- line 1
            var k = map.computeIfAbsent(x, HashSet::new);           // ----- line 2
            k.add(y);
        }
    }
}

以上代码在jdk 17、18、19抛出:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.base/java.util.HashMap.resize(HashMap.java:702)
    at java.base/java.util.HashMap.putVal(HashMap.java:627)
    at java.base/java.util.HashMap.put(HashMap.java:610)
    at java.base/java.util.HashSet.add(HashSet.java:221)
    at _explore.ComputeIfAbsentWithHashSetNew.main(ComputeIfAbsentWithHashSetNew.java:15)

debug的时候看到newCap Hashmap::resize()里面的newCap很大,不知道为什么。 我以前认为两条线都做同样的事情。

当我用代码中的第 1 行替换第 2行时,它运行成功。

HashSet::new是指向new HashSet(initialCapacity)的方法引用。 请参阅HashSet的 java-doc。

因此,它创建了一个比您预期更大的HashSet s,因为它将您的x变量作为参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM