0

java中的对象引用真的让我很困惑。而当我开始学习链表时,我意识到我对这个主题知之甚少。我的问题是

Node node = list; 

假设 list 是我的linkedlist 中的第一个节点,我知道这个操作意味着 node 引用了 list 所引用的同一个对象。我的意思是,如果我对节点进行更改,因此对它所引用的对象进行更改,列表也会受到这些更改的影响。但是,我不明白 node.next 和 list.next 也指的是同一个对象。我的意思是,如果我像这样写链表

Node node = list;
node = node.next;

这是否意味着我也在用 list.next 更改列表?或者,如果我写 (node.next.name = "B"),我是否还要更改 list.next 元素的名称?我知道这些问题看起来很愚蠢,但我真的对参考资料一无所知。我也对这个主题进行了很多研究。但是到目前为止我在网上找到的东西对我没有多大帮助。如果有人以清晰易懂的方式向我解释,我将不胜感激。

4

3 回答 3

3

您知道引用意味着在内存中,它们对内存中的数据具有相同的“引用”。

所以它nodelist同一个对象一样简单。

如果您认为数据存储在内存(RAM)中。把记忆想象成一个装满抽屉的壁橱,

如果 的数据node在 2 号抽屉中。“by Reference”表示node = listlist指 2 号抽屉。

现在,无论您在数据中进行什么更改,您都在更改 2 号抽屉的值。因此,您同时更改nodelist

于 2013-05-07T01:30:49.037 回答
1

Node node是一个包含引用的变量。“引用”是“指针”的另一个术语——对象的内存地址。

当您分配一个值时,node您将对象的地址存储在该位置。相同的地址可以存储在其他地方,允许从代码中的不同位置访问对象。

如果你有一个链表节点对象,它可能有“下一个”和“名称”的字段。在这种情况下,name 字段可能是对一个对象(例如,一个字符串)的引用,它是节点的“值”(或至少是节点的“值”的一部分)。“下一个”字段几乎可以保证键入以保存节点引用(尽管列表末尾的值可能为 null)。

因此,您的局部node变量可能“指向”一个 Node 对象,该对象包含一个next“指向”另一个 Node 对象的字段,该对象包含一个指向另一个 Node 对象的“next”字段,无穷无尽。

(要理解的重要一点是,仅仅因为您有一个 Node 对象,其“next”字段指向某处并不意味着每个Node 对象的“next”字段都指向相同的某处。该字段的名称不是对象的身份。)

当你做这样的事情时node.next.name = "B";,可以分解成:

Node temp = node.next;
temp.name = "B";

您将使用 node.next 寻址的节点中的“名称”字段已更改。node给你最近节点的地址,node.next然后给你最近节点旁边的节点地址。

此序列(来自您的原始帖子):

Node node = list;
node = node.next;

是您可能在开始遍历列表的代码中看到的内容。第一行node从名为 的“列表头”指针初始化list。然后第二行“推进”节点到列表中的第二个节点。因此,在此语句之后node是寻址列表的第二个节点。

于 2013-05-07T01:44:32.157 回答
0

您问:

这是否意味着我也在用 list.next 更改列表?

不,您只是重新分配对象变量(对象引用)node以指向列表中的不同节点。

如果我写 (node.next.name = "B"),我是否还要更改 list.next 元素的名称?

什么时候node分配给list然后你写的陈述是真的。之后node = node.next;的行为会修改一个不同的节点。

如果您记住列表中的任何 NODE 或 NODES 子集,可以将其视为一个列表,这将很有帮助。

希望有帮助。

于 2013-05-07T01:31:01.447 回答