不再需要时,是否需要手动处理java树结构?

时间:2013-04-18 08:18:25

标签: java memory data-structures tree

我在我的应用程序中构建了许多对象树,其中每个节点都是典型的树节点(对父节点的引用和对子节点的引用列表)。这些树是临时的,这意味着我可以在应用程序终止之前处理它们。

到目前为止,我总是向树节点类添加一个方法,该方法能够递归遍历树分支并“销毁它”(将父引用设置为null并清除子列表等)。

public void destroy() {
    for (Node node : children) {
        node.destroy();
    }
    parent = null;
    children.clear();
}

这对我来说总是有意义的,因为简单地将对存储在某个地方的树的根的引用置零是不够的 - 孩子们可能仍然会引用它,这意味着它将留在内存中并导致内存泄漏。我是否正确地假设并提供这样的方法?

我怀疑自己的原因是我很少在API中看到提供树结构支持的方法(至少不直接在树节点接口中)。处理此类案件的正确模式是什么?

2 个答案:

答案 0 :(得分:4)

您不需要自己销毁或清理物品。

您只需要确保 live 对象没有对它们的引用( live 听起来很清楚,但这个定义相当复杂)。

请注意,即使不需要的对象中有课程参考,您也不需要关心它们,GC会处理这个问题。

相关:

Does assigning objects to null in Java impact garbage collection?

Can a class be nullified from within the class itself?

Is it really necessary to nullify objects in JUnit teardown methods?

答案 1 :(得分:1)

我最近考虑了这个,并得出结论,答案是否定的 - 主要是。

如果你有一个正常的Tree类型结构,使用Node持有对data的引用,那么你可以揭露结构的唯一方法(因此阻止它被处置)是分发你的Node。如果你这样做,当然你的树的大块可以被另一个组件引用。

大多数情况下,您将分发data,它本身没有任何对树中其余节点的引用。

但是,可能会错误地设计数据结构,因此您可以公开树的内部结构。例如,如果您将Map.Entry类设计为保存对树结构组件的引用,例如条目所在的节点,那么您将遇到问题。

请记住,垃圾收集过程的作用是将所有视为无法访问,除非它可以访问。仅仅因为你有一个复杂的交织结构并不意味着它丢弃很复杂。

相关问题