带有递归的Java ArrayList内存使用情况

时间:2015-08-13 12:27:47

标签: java memory arraylist

我只是在查看一些代码并遇到了一个我无法解释的问题,很可能是因为我的Java有点生疏......代码采用嵌套的节点集合并展平。 / p>

这是原始代码段:

private static List<NavigationNode> flatten(
        List<NavigationNode> nodes,
        List<NavigationNode> flattenedNodes) {
    if (nodes == null || nodes.isEmpty()) {
        return Collections.emptyList();
    }
    for (NavigationNode node : nodes) {
        flattenedNodes.add(node);
        flattenedNodes.addAll(flatten(node.getChildren(), flattenedNodes));
    }
    return flattenedNodes;
}

我遇到的问题是,当嵌套列表变得足够大时,会抛出java.lang.OutOfMemoryError。

如果我新推平顶列表而不是作为参数传递并重构为:

private static List<NavigationNode> flatten(
        List<NavigationNode> nodes) {
    if (nodes == null || nodes.isEmpty()) {
        return Collections.emptyList();
    }
    List<NavigationNode> flattenedNodes = new ArrayList<NavigationNode>();
    for (NavigationNode node : nodes) {
        flattenedNodes.add(node);
        flattenedNodes.addAll(flatten(node.getChildren()));
    }
    return flattenedNodes;
}

不再出现内存错误。

非常感谢任何帮助,优秀的描述或进一步的重构!

0 个答案:

没有答案