gpt4 book ai didi

java - Java Collectors.toMap内存优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:53 26 4
gpt4 key购买 nike

我有一个将列表转换为 map 的函数。调用该函数后 map 的大小不会改变。我正在尝试在以下两种实现之间做出决定:

Map<Long, Object> listToMap(List<Object> objs) {
/* Implementation One: */

Map<Long, Object> map = new HashMap<>(objs.size(), 1);
for (Object obj : objs) {
map.put(obj.getKey(), obj);
}
return map;

/* Implementation Two: */

return objs.stream().collect(Collectors.toMap(Object::getKey, obj -> obj));

}

在第一个实现中,我通过使用 1 的加载因子和列表的大小为所有元素分配了足够的内存。这确保不会执行调整大小操作。然后,我遍历列表并逐一添加元素。

在第二个实现中,我使用 Java 8 流来提高可读性。

我的问题是:第二个实现是否涉及多次调整 HashMap 的大小,或者它是否经过优化以分配足够的内存?

最佳答案

第二个实现将涉及多次调整 HashMap 的大小。

我通过简单地在调试器中运行它并在每次调整 HashMap 大小时中断来确定这一点。首先,我调整了您发布的代码,使其可以在我的系统上编译:

import java.util.*;
import java.util.stream.*;

class Test {
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();
for(int i=0; i<100000; i++) {
list.add(new Integer(i));
}
new Test().listToMap(list);
}

Map<Integer, Object> listToMap(List<Object> objs) {
return objs.stream().collect(Collectors.toMap(Object::hashCode, obj -> obj));
}
}

然后我编译它并在调试器中运行它直到它命中 listToMap:

$ javac Test.java && jdb Test
Initializing jdb ...
> stop in Test.listToMap
Deferring breakpoint Test.listToMap.
It will be set after the class is loaded.
> run
run Test
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started: Set deferred breakpoint Test.listToMap

Breakpoint hit: "thread=main", Test.listToMap(), line=14 bci=0
14 return objs.stream().collect(Collectors.toMap(Object::hashCode, obj -> obj));

main[1]

然后我在java.util.HashMap.resize中设置断点并继续:

main[1] stop in java.util.HashMap.resize
Set breakpoint java.util.HashMap.resize
main[1] cont
>
Breakpoint hit: "thread=main", java.util.HashMap.resize(), line=678 bci=0

main[1]

cont继续学习,直到我觉得无聊为止:

main[1] cont
>
Breakpoint hit: "thread=main", java.util.HashMap.resize(), line=678 bci=0

main[1] cont
>
Breakpoint hit: "thread=main", java.util.HashMap.resize(), line=678 bci=0

main[1] cont
>
Breakpoint hit: "thread=main", java.util.HashMap.resize(), line=678 bci=0

main[1] cont
>
Breakpoint hit: "thread=main", java.util.HashMap.resize(), line=678 bci=0

main[1] cont
>
Breakpoint hit: "thread=main", java.util.HashMap.resize(),
line=678 bci=0

main[1] print size
size = 3073
main[1] cont
>
Breakpoint hit: "thread=main", java.util.HashMap.resize(), line=678 bci=0

main[1] print size
size = 6145
main[1] cont
>
Breakpoint hit: "thread=main", java.util.HashMap.resize(), line=678 bci=0

main[1] print size
size = 12289

所以是的:它肯定会一遍又一遍地调整大小。

关于java - Java Collectors.toMap内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51333730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com