微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java如何存储无限递归对象

如何解决Java如何存储无限递归对象

下面的代码以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);
    }

解决方法

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

打个比方,如果每次您写下某人的住所时,您都需要完整的房屋副本,那么您的空间将很快用光。但是您不需要-您只需要参考他们的房子,而房子本身可以包含您的参考。

请注意,编写代码很容易导致包含自身引用的对象引起堆栈溢出。例如,如果您的课程有一个方法:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。