【问题标题】:How does java store infinite recursive object [duplicate]java如何存储无限递归对象[重复]
【发布时间】:2021-02-03 22:50:04
【问题描述】:

下面的代码展示了 leetcode 中的一个数据结构。我们可以看到 node1 存储了一个带有 node2 和 node3 的列表,node2 将存储了一个带有 node1 和 node4 的列表。在这种情况下,我认为 node1 和 node2 将存储彼此的对象,这将导致无限递归。 java怎么存储这样的数据结构,不会造成内存溢出吗?

class Node {
    public int val;
    public List<Node> neighbors;

    public Node() {
        val = 0;
        neighbors = new ArrayList<Node>();
    }

    public Node(int _val) {
        val = _val;
        neighbors = new ArrayList<Node>();
    }

    public Node(int _val, ArrayList<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
}
public static void main(String[] args) {
        Node node1 = new Node(1, new ArrayList<>());
        Node node2 = new Node(2, new ArrayList<>());
        Node node3 = new Node(3, new ArrayList<>());
        Node node4 = new Node(4, new ArrayList<>());

        node1.neighbors.add(node2);
        node1.neighbors.add(node4);

        node2.neighbors.add(node1);
        node2.neighbors.add(node3);

        node3.neighbors.add(node2);
        node3.neighbors.add(node4);

        node4.neighbors.add(node1);
        node4.neighbors.add(node3);

        Solution solution = new Solution();
        solution.cloneGraph(node1);
    }

【问题讨论】:

  • 没有递归。
  • 嗨@Jackie。我能理解这让你感到困惑。您的理解是正确的,每个对象都存储其他对象的对象。但请记住,存储对象发生在内存中。递归是一种计算技术。以某种方式存储数据并不意味着会有递归。进行一些计算时会发生递归。例如。在图遍历期间(在这种情况下),这将需要解决方案工程师处理递归可能进入无限循环的情况。你应该尝试解决一些图遍历问题来掌握它。

标签: java recursion data-structures


【解决方案1】:

您对导致超出内存的代码是正确的如果每个节点的邻居列表包含这些邻居的副本。但这不是 Java 的工作方式。相反,该列表包含对相邻节点的引用

打个比方,如果您每次写下某人的地址时都需要一份他们房子的完整副本,那么您很快就会用完空间。但你不需要 - 你只需要一个对他们房子的引用,它本身可以包含对你的引用。

请注意,编写导致堆栈溢出的代码非常容易,其中包含对其自身的引用的对象。例如,如果你的类有一个方法:

class Node {
    public int sumVals() {
        return val + neighbours.stream().mapToInt(Node::sumVals).sum();
    }
}

调用node1.sumVals()会导致无限递归。

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2018-06-15
    • 2020-06-25
    相关资源
    最近更新 更多