【发布时间】:2014-05-14 23:42:29
【问题描述】:
for(int i=0; i<words.size(); i++){
for(int j=0; j<Final.size(); j++){
if(words.get(i)==Final.get(j)){
temp=times.get(j);
temp=temp+1;
times.set(j, temp);
}
else{
Final.add(words.get(i));
times.add(1);
}
}
}
我想创建两个 ArrayList;次(整数)和最终(字符串)。 ArrayList "words" 包括一个字符串的单词,并且一些单词被多次显示。我想要做的是将“单词”的每个单词(但只有一次)添加到“Final”,并将数字(这个单词出现在“单词”上的次数)添加到“times”。有什么问题吗? 因为我得到 OutOfMemoryError: Java heap space
【问题讨论】:
-
我会使用
Map<String, Integer>或Map<String, int[]>,因为这在 CPU 方面会显着提高效率,但不确定它是否有助于内存。我建议您尝试使用内存分析器,看看是什么占用了这么多内存。 -
我认为你的内部循环永远不会终止,因为你不断增加
Final的大小,所以你的终止条件永远不会满足,最终你会用完堆空间。 -
@Ralf 如果单词已经在其中,最终大小只会增加。当循环开始时,它有一定的大小
-
@Ralf 几乎是正确的。您的内部 for 循环状态:对于 Final 中不等于 my word 的每个单词,将 my word 添加到 Final 的末尾。这是指数增长(它会吞噬你的记忆)。逻辑完全错误,试着用一个空的 Final 开始运行它,最后你不会得到字典,只有空列表。
标签: java arraylist out-of-memory