我有一個字典作爲文本文件從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