1

不久前,我在 C 中实现了一个 LinkedList。这非常简单,因为每个 Node 都由一个值和另一个指向列表中下一个元素的指针组成。但是现在我正在尝试在 Java 中实现一个 LinkedList,因为没有指针我做了一个这样的节点:

public class MyNode{
    int value;
    MyNode next;

    public MyNode(int i){
        value = i;
        next = null;
    }
}

现在让我们说我有这个:

MyNode n1 = new MyNode(1);
MyNode n2 = new MyNode(2);
n1.next = n2;
MyNode n3 = new MyNode(3);
n2 = n3;

如果我这样做,我会得到什么

System.println(n1.next.value);

我会得到2还是3?我来自 C 的主要问题是我并不真正了解 java 如何在数据中移动。它是将 n2 复制到 n1 还是 n1 只是指向 n2?这一切真的很令人困惑。

4

3 回答 3

5

尝试用指针进行类比(我们在 Java 中称它们为引用):

您可以将变量(n1、n2、n1.next 等)视为指向内存中某处对象的指针。因此new Node(2);创建一个节点并将其放置在内存中n2 = ...并使变量n2指向该节点的“地址”。

然后,当您编写n1.next = n2;时,您通过将该地址的n1.next复制到 中来指向同一个“地址” 。n1.next

当您稍后编写n2 = n3;时,您使n2变量指向不同的“地址”,但n1.next仍指向初始new Node(2)对象的地址。

底线:System.out.println(n1.next.value);打印 2,而不是 3。

相关帖子:Java 是“按引用传递”还是“按值传递”?

于 2013-04-16T05:29:07.860 回答
1

响应为 2。

n1.next将继续指向您的实例MyNode(2); n2 = n3 之后;n2 指向 n3 但您将在n1.next上保留实例MyNode(2)的引用。

GarbageCollector 只会收集没有任何引用的对象实例。在这种情况下,您将继续在n1.next上引用实例 (MyNode(2))

于 2013-04-16T05:30:02.137 回答
0

在java中,变量总是按值传递。Java 将对象作为按值传递的引用传递。

例如,您的代码

MyNode n1 = new MyNode(1);
MyNode n2 = new MyNode(2);
n1.next = n2;
MyNode n3 = new MyNode(3);
n2 = n3;

就是这样执行的。

创建新节点为 n1,值为 1

创建新节点为 n2,值为 2

将对象 n1.next 设置为 n2

创建新节点为 n3,值为 3

将 n2 引用的对象替换为 n3 引用的对象(它不会替换n1.next

所以你的呼吁

System.out.println(n1.next.value);

打印 2。

于 2013-04-16T05:19:22.797 回答