1
我正在研究一个nGrams,并且我使用嵌套的TreeMap类数据结构来存储ngrams。 Quadgrams的模板如下所示。如何迭代嵌套的TreeMap而不创建临时对象
public TreeMap<String, TreeMap<String, TreeMap<String, TreeMap<String, Integer>>>> ngramWordCounter;
当我试图把它记录到文件中,基本上我遍历第一张地图的密钥集,然后进入第二等等等等的键盘布局的问题引起的。结果创建了很多临时对象,并且出现GCOverlimitExceeded错误。迭代的代码片段如下,
for(String key: ((Quadgram)quadgram).ngramWordCounter.keySet())
{
for(String key1: ((Quadgram)quadgram).ngramWordCounter.get(key).keySet())
{
for(String key2: ((Quadgram)quadgram).ngramWordCounter.get(key).get(key1).keySet())
{
for(String key3:((Quadgram)quadgram).ngramWordCounter.get(key).get(key1).get(key2).keySet())
{
//Do something
}
}
}
}
有没有更好的方式来遍历此列表而不创建临时对象?
恰好引用'字符串key'和'字符串value'循环结束后怎么办?这些变量需要通过GarbageCollector来实现,因为Strings确实是对象。 [http://stackoverflow.com/questions/18406703/when-will-a-string-be-garbage-collected-in-java] –
是的引用将被删除而不是实际的对象。如果你检查实现,内部TreeMap存储Entry对象本身。但是所有的处理都在循环内部(从给定的示例代码猜测) –