【问题标题】:Nodes in Java, coming from C backgroundJava中的节点,来自C背景
【发布时间】:2013-04-08 09:34:55
【问题描述】:

不久前,我在 C 中实现了一个 LinkedList。这非常简单,因为每个节点都由一个值和另一个指向列表中下一个元素的指针组成。但是现在我正在尝试在 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?这一切都非常令人困惑。

【问题讨论】:

  • 我会得到 2 还是 3? => 你为什么不试试呢?
  • 你完全正确。我应该在我问之前尝试过,但我仍然想知道 Java 如何处理“n1.next = n2;”这一行
  • 这可能会有所帮助:stackoverflow.com/questions/10042/…
  • @Hiny 请阅读 OP正文底部的问题。
  • Java 教程中很好地解释了这个问题和相关问题。请参阅StackOverflow Java wiki 以获取 Java 介绍和网上可用的在线教程列表。

标签: java c linked-list nodes


【解决方案1】:

尝试用指针做一个类比(我们在 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。

相关帖子:Is Java "pass-by-reference" or "pass-by-value"?

【讨论】:

  • 最后一个不错的答案,不谈论 Java 通过引用传递
【解决方案2】:

响应为 2。

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

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

上引用实例 (MyNode(2))

【讨论】:

    【解决方案3】:

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

    例如,你的代码

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

    就是这样执行的。

    创建新节点为 n1,值为 1

    用值为 2 的 n2 创建新节点

    将对象 n1.next 设置为 n2

    创建新节点为 n3,值为 3

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

    所以你的呼吁

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

    打印 2.

    【讨论】:

    • 我来自 C 的主要问题是我并不真正了解 java 如何在数据中移动。它是将 n2 复制到 n1 还是 n1 只是指向 n2?这真是令人困惑。这是真正的问题。
    • AFAIK int 不是参考,只是一个原始类型。 int 变量是否也作为引用传递:在 java 中,变量是通过引用传递的
    • @LuiggiMendoza 但是数据类型的变量是按值传递的。
    • 请看assylias' answer中关于Java的链接是通过引用传递的,并得到你自己的结论。
    • @LuiggiMendoza 谢谢。今天学到了一个新东西。
    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2015-04-21
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多