存储在HashMap中的重复值

mos*_*aab 1 java hashmap

我有一个字典作为从2M单词到50k单词的文本文件映射.我将此文件加载到内存中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();
}
Run Code Online (Sandbox Code Playgroud)

Duk*_*ing 5

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

一个简单的例子示出了本.

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

String.intern()作为joe776建议的替代方案可能是自编写的集合,其中一些Set(因为Set没有Object get(Object)方法)或另一个HashMap(具有指向自身的对象)允许您获得对公共对象的引用.