Java变量未更改,即使在它指向的引用更改之后
我试图在result.next中赋值,但不知何故,当I=1迭代完成时,值并没有改变 初始结果为空 当i为0时的第一次迭代,result.next指向ListNode(10) 当i=1完成执行时,我期望ListNode(2)旁边的result.value,因为它引用了tempJava变量未更改,即使在它指向的引用更改之后,java,variables,scope,Java,Variables,Scope,我试图在result.next中赋值,但不知何故,当I=1迭代完成时,值并没有改变 初始结果为空 当i为0时的第一次迭代,result.next指向ListNode(10) 当i=1完成执行时,我期望ListNode(2)旁边的result.value,因为它引用了temp public void Mymethod() { ListNode result = null; ListNode temp = new ListNode(10); int j
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;
}
}
public void Mymethod(){
ListNode结果=null;
ListNode温度=新ListNode(10);
int j=0;
对于(int k=0;k<10;k++){
对于(int i=0;i<2;i++){
如果(j==0){
j++;
结果=新的ListNode(1);
result.next=温度;
持续
}
temp=新的列表节点(2);
}
}
}
类ListNode{
公共国际价值;
公共列表节点下一步;
ListNode(intx){
val=x;
next=null;
}
}
…因为它引用了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;
}
}
否,它有一个引用的副本,该引用在result.next=temp
行的temp
中。但是result.next
和temp
之间没有持续的联系。稍后执行temp=new ListNode(2)
时,会将temp
的值更改为一个新引用,这对结果没有任何影响。下一步
在内部循环的第一次迭代中的result.next=temp
行之后,下面(大致)是我们内存中的内容:
[temp: Ref11243]−−−−−−−−−−−−−−−−−−−−−−−−−−+
|
|
|
| +−−−−−−−−−−−−+
+ −−>| ListNode |
+−−−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−+
[result: Ref89895]−−−>| ListNode | | | val: 10 |
+−−−−−−−−−−−−−−−−+ | | next: null |
| val: 1 | | +−−−−−−−−−−−−+
| next: Ref11243 |−−+
+−−−−−−−−−−−−−−−−+
您有以下内容:
+−−−−−−−−−−−−+
[temp: Ref68545]−−−−−−−−−−−−−−−−−−−−−−−−−−−−−>| ListNode |
+−−−−−−−−−−−−+
| val: 2 |
| next: null |
+−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−−+
[result: Ref89895]−−−>| ListNode |
+−−−−−−−−−−−−−−−−+
| val: 1 | +−−−−−−−−−−−−+
| next: Ref11243 |−−−−−>| ListNode |
+−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−+
| val: 10 |
| next: null |
+−−−−−−−−−−−−+
+−−−−−−−−−−−−+
[温度:参考文献68545]−−−−−−−−−−−−−−−−−−−−−−−−−−−−−>| 列表节点|
+−−−−−−−−−−−−+
|瓦尔:2|
|下一个:空|
+−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−−+
[结果:参考文献895]−−−>| ListNode|
+−−−−−−−−−−−−−−−−+
|瓦尔:1 |+−−−−−−−−−−−−+
|下一篇:参考文献11243|−−−−−>| 列表节点|
+−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−+
|瓦尔:10|
|下一个:空|
+−−−−−−−−−−−−+
请注意temp
的值是如何更改的,因此现在它指向一个不同的ListNode
,即使用newlistnode(2)
创建的新节点
在您询问的评论中: 我如何在这里提供一些链接?这样每当
temp
被更改时result.next
就会开始指向新对象
不可以,Java没有任何变量引用的概念,只引用对象(包括数组)。@Vipin请在更改内部循环中的条件后再次运行此代码。它应该可以正常工作。在temp=new ListNode(2)之后,result.next将指向视图中的位置?@UmairFarooq指向先前由
new ListNode(10)
返回的对象temp
只是一个指针,而不是实际对象,因此指针可以指向一个新对象,并且它与以前指向的值不再有任何关系,因此我们在result中保存了引用。接下来,由于垃圾收集器不会清除以前的对象。对吗?“但是没有持续的链接”,你能帮我理解这一点吗?我怎样才能纠正这个问题?太好了。再次刷新了我的概念。你有一些清晰的概念。谢谢分享知识