gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:41:54 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com