import java.util.HashMap;\nimport java.util.HashSet;\n\npublic class ComputeIfAbsentWithHashSetNew {\n public static void main(String[] args) {\n var map = new HashMap<Integer, HashSet<Integer>>();\n var data = new int[][]{{305589003, 4136}, {305589004, 4139}};\n for (var entry : data) {\n int x = entry[0];\n int y = entry[1];\n// map.computeIfAbsent(x, _x -> new HashSet<>()).add(y); // ----- line 1\n var k = map.computeIfAbsent(x, HashSet::new); // ----- line 2\n k.add(y);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n上面的代码抛出 jdk 17\xe3\x80\x81 18\xe3\x80\x81 19:
\nException in thread "main" java.lang.OutOfMemoryError: Java heap space\n at java.base/java.util.HashMap.resize(HashMap.java:702)\n at java.base/java.util.HashMap.putVal(HashMap.java:627)\n at java.base/java.util.HashMap.put(HashMap.java:610)\n at java.base/java.util.HashSet.add(HashSet.java:221)\n at _explore.ComputeIfAbsentWithHashSetNew.main(ComputeIfAbsentWithHashSetNew.java:15)\nRun Code Online (Sandbox Code Playgroud)\n调试时,我看到newCapinHashmap::resize()很大,我不知道为什么。我认为这两条线之前都做了同样的事情。
当我将代码中的第 2 行替换为第 1 行时,它运行成功。
\nHashSet::new是指向 的方法引用new HashSet(initialCapacity)。请参阅HashSet的 java-doc 。
因此,它创建的HashSets 比您预期的要大,因为它将您的x变量作为参数。
| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |