gpt4 book ai didi

java - HashMap 中存储的重复值

转载 作者:行者123 更新时间:2023-11-29 06:37:58 24 4
gpt4 key购买 nike

我有一个字典作为文本文件映射自 2M50k字。我将此文件作为 HashMap<String, String> 加载到内存中通过逐行读取文件,拆分分隔符并调用 myMap.put(line[0], line[1]) .文本文件的大小为 45MB ,而 HashMap 使用 350MB堆的。我的目标是在不损害查找速度的情况下减少内存使用。 myMap.values().size()返回 2M而不是 50k ,表明这些值存储为重复项。有没有办法让相同的值指向同一个 String 对象?

Map<String, String> dict = new HashMap<>();
try (FileReader fr = new FileReader(FILE);
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
String key_value[] = line.split(":");
dict.put(key_value[0], key_value[1].intern());
}
} catch (Exception e) {
e.printStackTrace();
}

最佳答案

无论重复项是否指向相同的对象,仍然需要引用这些对象,因此 size 仍应返回包含重复项的大小。

A simple example showing this .

如果您希望重复项指向相同的对象,您必须在 HashMap 之外执行此操作,或者希望优化器处理它。

String.intern() 的替代方案为 joe776 suggested可能有一个自写的集合扩展了一些 Set(因为 Set 没有 Object get(Object) 方法)或另一个 HashMap(让对象指向它们自己)允许您获取对公共(public)对象的引用。

关于java - HashMap 中存储的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17574749/

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