关于Java参考的困惑

时间:2018-01-12 00:47:32

标签: java reference

说我有一个简单的Node类:

public class Node {
    public Integer data = null;
    public Node next = null; 

    public Node(int data) {
        this.data = data;
    }
}

现在我使用这个节点创建一个链表:

    Node n1 = new Node(1);
    Node n2 = new Node(2);
    Node n3 = new Node(3);
    Node n4 = new Node(4);
    n1.next = n2;
    n2.next = n3;
    n3.next = n4;

这基本上是:1 -> 2 -> 3 -> 4 -> null

到目前为止一切顺利。现在,如果我是对的,则n1,n2,n3和n4保存存储Node的相应实例的地址。所以我继续,并做到这一点:

n2 = n3;

即。将存储在n3中的地址也放入n2。

所以我希望输出列表如下:1 -> 3 -> 4 -> null
但我得到的输出仍然是:1 -> 2 -> 3 -> 4 -> null

我误解了什么?列表如何仍然完好无损?

2 个答案:

答案 0 :(得分:3)

你基本上正在改变n2所指的不是n2.next。 n2和n2.next是指向2个不同对象的引用。您必须将n1.next设置为n3以获得您期望的行为。但是,n2.next仍将指向n3。

答案 1 :(得分:2)

链接列表的工作方式,您只需要对第一个节点进行完整的引用即可遍历列表。

所有行n2 = n3正在做的是将n2中的引用从节点2更改为节点3,节点本身不变。

n1.next()仍将等于第二个节点。

n1.next().next()将等于第3个节点。

n1.next().next().next将等于第4个节点。