我有一个字典作为文本文件从2M
字映射到50k
字。我通过逐行读取文件,在分隔符上分割并调用myMap.put(line[0], line[1])
,将此文件加载到内存中作为HashMap<String, String>
。文本文件的大小为45MB
,而HashMap使用堆的350MB
。我的目标是减少内存使用,而不会影响查找速度。 myMap.values().size()
返回2M
而不是50k
,表明这些值存储为重复值。有没有办法让相同的值指向同一个String对象?存储在HashMap中的重复值
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();
}
如果你有2M独特的单词映射到50k(非唯一)的话,那么你hashmap的大小将是2M。 – assylias
hashmaps大小是基于条目,因此键的数量。关于重复值:JVM使用字符串值进行一些优化。由于字符串是不可变的,它通常对同等的字符串使用相同的对象。你不能依赖那个,但可能你的字符串已经不重复了。 –
@assylias我知道。我的问题是如何避免存储重复值。这是允许多个键指向映射到相同的对象值。 – mossaab