java - 如何在不创建临时对象的情况下迭代嵌套的 TreeMap

标签 java garbage-collection treemap temporary-objects

我正在研究 nGram,并且使用嵌套的 TreeMap 类型的数据结构来存储 ngram。 Quadgrams 的模板如下所示。

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
        }
    }
  } 
}

是否有更好的方法来迭代此列表而不创建临时对象?

最佳答案

不会创建新对象。将创建新的引用。

Map 返回对键集中键的引用。使用this reference要探索这个概念,或者您可以阅读有关此概念的 java 教程。

我更喜欢以下迭代 map 的方式

for (Map.Entry<String, String> entry : map.entrySet()) {
        String key = entry.getKey();
            String value = entry.getValue();
            // process key and value
}

关于java - 如何在不创建临时对象的情况下迭代嵌套的 TreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22189340/

相关文章:

java - JVM 使用 JOGL、顶点缓冲区对象并尝试在 finalize 方法中释放 vbo 时崩溃

java - TreeMap - 搜索时间复杂度

javascript - D3.js:如何根据 TreeMap 中每个内容的大小来决定每个方 block 的面积和颜色?

java - 创建名称为 : Lookup method resolution failed; nested exception is IllegalStateException: Failed to introspect Class from ClassLoader 的 bean 时出错

java - linux下java调用C#mono代码

java - 连接数据库时出现 SQlite 错误

java - Sugiyama Layout for Java 是否有一个很好的免费实现?

asp.net-mvc - ASP MVC : When is IController Dispose() called?

java - 如果老年代的对象需要引用年轻代的对象怎么办?

java - 如何将我创建的类设置为 TreeMap 中的键 (Java)