我正在尝试在result.next中赋值,但是当i = 1迭代完成时,某些值不会被改变。
最初结果为空。
当i为0时,第一次迭代,result.next指向ListNode(10)
当i = 1完成执行时,我期待result.next到ListNode(2)的值,因为它有temp的引用。
public void Mymethod() {
ListNode result = null;
ListNode temp = new ListNode(10);
int j = 0;
for (int k = 0; k < 10; k++) {
for (int i = 0; i < 2; i++) {
if (j == 0) {
j++;
result = new ListNode(1);
result.next = temp;
continue;
}
temp = new ListNode(2);
}
}
}
class ListNode {
public int val;
public ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
答案 0 :(得分:4)
...因为它引用了temp。
不,从temp
行开始, <{em> result.next = temp
中的引用的副本。但result.next
和temp
之间没有持续的关联。稍后当您执行temp = new ListNode(2)
时,会将temp
的值更改为新引用,这对result.next
无效。
在内循环的第一次迭代中的result.next = temp
行之后,这里(大致)我们在内存中的内容:
[temp: Ref11243]−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | | | +−−−−−−−−−−−−+ + −−>| ListNode | +−−−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−+ [result: Ref89895]−−−>| ListNode | | | val: 10 | +−−−−−−−−−−−−−−−−+ | | next: null | | val: 1 | | +−−−−−−−−−−−−+ | next: Ref11243 |−−+ +−−−−−−−−−−−−−−−−+
请注意,result
和temp
都包含相同的值,即对您在顶部创建的ListNode
的引用(我在上面显示为{{{ 1}},但我们从未看到或需要看到实际值。)
但是当你这样做时:
Ref11243
你改为:
+−−−−−−−−−−−−+ [temp: Ref68545]−−−−−−−−−−−−−−−−−−−−−−−−−−−−−>| ListNode | +−−−−−−−−−−−−+ | val: 2 | | next: null | +−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−+ [result: Ref89895]−−−>| ListNode | +−−−−−−−−−−−−−−−−+ | val: 1 | +−−−−−−−−−−−−+ | next: Ref11243 |−−−−−>| ListNode | +−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−+ | val: 10 | | next: null | +−−−−−−−−−−−−+
请注意temp = new ListNode(2);
值的变化情况,现在它指向另一个temp
,新的ListNode
创建了。{/ p>
在评论中你曾问过:
我如何在这里提供一些链接?这样每当
new ListNode(2)
被更改temp
时,就会开始指向新的对象。
你不能,Java没有任何引用变量的概念,只是引用对象(包括数组)。