java - 通过这两种方式更新方法内 Linkedlist 的值有什么区别?

标签 java

我正在使用 Linkedlist 编写队列结构。我正在编写将元素添加到队列的方法。由于问题指定该方法应具有 void enqueueCharacter(char ch) 签名,因此我编写了另一个签名为 void enqCharacter(queueNode q, char ch) 的方法,并在 enqueueCharacter 中调用此方法。

一开始它失败了,我不知道为什么。我做了一个小小的改变只是为了尝试并且它起作用了。但事实上,我认为它们要么都有效,要么都失败,因为(我认为)它们具有完全相同的概念。

这是queueNode的定义:

class queueNode
{
    char head;
    queueNode tail;
    queueNode(char c)
    {
        head = c;
        tail = null;
    }
}

以及队列的声明:

queueNode queue = null;

这是我最初写的更新队列的内容:

public void enqCharacter(queueNode q, char ch)
{
    if( q == null ) q = new queueNode( ch );
    else enqCharacter( q.tail, ch );
}

public void enqueueCharacter(char ch)
{
    enqCharacter( queue, ch );
}

这个概念是在我调用 enqueueCharacter(char ch) 后立即调用 enqCharacter(queue, ch) 并且不执行任何其他操作。在 enqCharacter(queueNode q, char ch) 中,我检查 q 是否为 null,如果是,则将第一个元素添加到 q,否则对 q.tail 执行相同的操作。但我检查了一下,结果发现我从未真正更改过队列的值,但它应该是因为我将队列传递给了该方法(我也尝试传递 this.queue 但仍然不起作用)。

然后我稍微改变了一下:

public void enqCharacter(queueNode q, char ch)
{
    if( q.tail == null ) q.tail = new queueNode( ch );
    else enqCharacter( q.tail, ch );
}

public void enqueueCharacter(char ch)
{
    if( queue == null ) queue = new queueNode( ch );
    else enqCharacter( queue, ch );
}

我做出这些改变只是因为我没有其他想法,不是因为我认为这更好,但它确实有效。我仍然不知道为什么。

谁能解释一下为什么我应该更新尾部而不是队列本身?非常感谢!

最佳答案

Java 是“按值传递”。

当您将 q.tail 作为参数发送给该方法时,您正在发送该值,因为这是一个引用类型,该值将是此引用(q.tail)引用的对象位置。

因此,当 q.tail 为 null 时,您将 null 值(即 null 引用)作为参数发送给方法 enqCharacter,然后将新的 queueNode 对象分配给该 null 引用。

但在第二种情况下,您在任何情况下都不会将空引用作为参数发送给 enqCharacter,因此您可以在第二种情况下保留链,因为您拥有对该链的引用。在第一种情况下,一旦您发送 null 作为参数,然后分配一个全新的 queueNode 对象,您就会丢失引用。

关于java - 通过这两种方式更新方法内 Linkedlist 的值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41440281/

相关文章:

java - 如何在android中检查txt文件中的一行是否以 "h"开头?

java - 无法在联系人实体中将位置模型设置为空

javascript - 无法启动模拟器。原因: No emulators found as an output of `emulator -list-avds` .,安装应用程序失败

java - 更改像素的 alpha 值

java - 从自己的 Jar 项目调用 Jar 库?

java - 将 akka ByteString 转换为 Java InputStream?

java - java访问问题

java - GWT 应用程序的数据存储位置 - GAE 数据存储或 XML 文件

java - 使用 64 位 Java SDK 和 64 位 Windows 在 C# 中运行用于 JavaAccessability 的示例 Java 应用程序

java - 如何检查 PageObject 的所有元素是否有效(Java、Serenity、Cucumber)