java中的对象引用真的让我很困惑。当我开始学习链表时,我意识到我对这个主题知之甚少。我的问题是
Node node = list;
假设list是我的链表中的第一个节点,我知道这个操作意味着节点引用了列表引用的同一个对象。我的意思是,如果我对节点进行更改,因此对它引用的对象进行更改,list也会受到这些更改的影响。但是,我不明白,node.next和list.next也引用同一个对象。我的意思是如果我写了像
这样的链表Node node = list;
node = node.next;
这是否意味着我也在使用list.next更改列表?或者如果我写(node.next.name =“B”),我还要更改list.next元素的名称吗?我知道这些问题看起来很傻,但我对参考资料一无所知。我也经常研究这个主题。但到目前为止我在网上发现的内容并没有对我有多大帮助。如果有人以清晰易懂的方式向我解释,我将非常感激。
答案 0 :(得分:3)
您知道引用意味着在内存中,它们与内存中的数据具有相同的“引用”。
因此它就像node
一样简单,list
是同一个对象。
如果您认为数据存储在内存(RAM)中。把记忆当作一个装满抽屉的壁橱,
如果node
的数据在抽屉编号2中。“按参考”表示node = list
表示list
也指抽屉编号2。
现在无论您在数据中更改了什么,您都会更改2号抽屉的值。因此,您要更改node
和list
答案 1 :(得分:1)
Node node
是一个包含引用的变量。 “引用”是“指针”的另一个术语 - 对象的内存地址。
为node
指定值时,您将在该位置存储对象的地址。相同的地址可以存储在其他地方,允许从代码中的不同位置访问对象。
如果您有链接列表Node对象,则可能包含“next”和“name”字段。在这种情况下,名称字段可能是对作为节点“值”的对象(例如,字符串)的引用(或者至少部分节点的“值”)。“下一个”字段几乎可以保证键入以保存节点引用(尽管列表末尾的值可能为null)。
因此,您的本地node
变量可能“指向”包含next
字段的Node对象,该字段“指向”另一个Node对象,该对象包含指向另一个的“next”字段节点对象,无限广告。
(要理解的一件重要事情是,仅仅因为你有一个带有“next”字段的Node对象指向某个地方并不意味着每个 Node对象的“next”字段都指向同一个某处。该字段的名称不是该对象的标识。)
当您执行node.next.name = "B";
之类的可以分解为:
Node temp = node.next;
temp.name = "B";
将使用node.next处理的节点中的“name”字段已更改。 node
为您提供最近的节点的地址,然后node.next
会为您提供最近节点旁边的节点的地址。
此序列(来自您的原始帖子):
Node node = list;
node = node.next;
是您可能在代码中看到的开始遍历列表的内容。第一行从名为node
的“列表头”指针初始化list
。然后第二行“前进”节点到列表中的第二个节点。因此,在此语句后node
正在寻址列表的第二个节点。
答案 2 :(得分:0)
你问:
这是否意味着我也在使用list.next更改列表?
不,您只需重新分配对象变量(对象引用)node
以指向列表中的其他节点。
如果我写(node.next.name =“B”),我是否还要更改list.next元素的名称?
将node
分配给list
时,您编写的语句为true。在node = node.next;
之后,该行为将修改不同的节点。
如果您记住列表中的任何NODE或NODES子集,可以将其视为一个列表。
希望有所帮助。