将完整的对象列表添加到JAVA列表中的每个对象

时间:2011-06-20 07:57:15

标签: java class list

您好我有2个Java课程,GossipNode,我希望Gossip能够保存Node类所有对象的列表,我希望每个Node对象也将具有该列表。我尝试用以下方式编写它:

public class Node {

    private Boolean val = null;
    private LinkedList<Node> list;
    static  Random rand = new Random(); 

    public Node(LinkedList<Node> list) {
        this.list=list; 
    }
    ... the rest of Node functions ...
}

Gossip承包商:

public class Gossip {

    private int count;
    private int n;

    private LinkedList<Node> list;

    public Gossip (int n) {
        this.count = 0;
        this.n = n;
        list = new LinkedList<Node>();
        for (int i=0; i<n; i++){
            list.add(new Node(list));
        }
    }
    ... the rest of Gossip functions ...
}

由于我已经习惯C++,我不确定它在这里是如何工作的,这是否会像指针一样工作,每个Node都会有一个完整的列表,或者每个Node将只有一个列表,其中包含Node之前和它自己。此外,我不需要更改程序上的列表,只是为了阅读它,但有趣的是,列表中Node所做的更改将影响所有其他Node的列表?

4 个答案:

答案 0 :(得分:1)

只有一个节点列表,所有节点都引用了这个列表。 这是因为在Node构造函数中,赋值this.list=list;不会创建对象的副本 - 它只会使this.listlist相同,但请记住它们都是引用(在堆栈)到对象(在堆上)。

因此,如果您通过其中一个节点更改列表,则所有其他节点都将看到更改。

答案 1 :(得分:1)

new LinkedList<Node>(); Gossip只创建一个列表{{1}}。后来它通过引用(像指针一样)传递,因此它在任何地方列出相同的内容。

答案 2 :(得分:1)

Node类是否在Gossip类之外使用?如果没有,那么您可能需要考虑将Node作为Gossip的私有内部类。这将简化事情,因为Node实例可以访问Gossip中的列表而无需自己引用它。您必须将列表定义为final才能执行此操作。

答案 3 :(得分:0)

java中从java.lang.Object派生的所有变量/字段都是“引用”,它与C ++中的指针基本完全相同。 (不要与C ++引用混淆,这些引用只有指针但具有特殊语义) 这意味着int,float和所有其他的原始值都是值而不是指针/引用,ofc。