假设我们有一个链接列表1->2->3->4->5
而1
是head
ListNode newHead = new ListNode(0);
ListNode p = newHead;
ListNode runner = newHead;
newHead.next = head; // Line 1 p and runner next is also head
while(n>0){
runner = runner.next; // Line 2 why newHead and p does not move along with runner just as above because they are equal object (I assume)
n--;
}
为什么不p
,newHead
和runner
同时发生变化?他们在Line 1
做了,但在Line 2
他们不知道为什么?
答案 0 :(得分:1)
假设newHead
位于记忆位置A
由于您将newHead
分配给p
,p
现在也指向内存位置A
。
runner
的逻辑相同,指向A
。
现在你设置newHead
的一些属性,其中"更改"所有三个newHead
,p
和runner
上的属性,因为它们都指向同一内存位置A
中的同一个对象。
如果您现在写runner = runner.next
,则为runner
分配一个新值
现在runner
指向内存位置B
。
但这对p
和newHead
无关紧要,因为它们只指向与runner
相同的位置,但没有其他关系。它们只指向相同的位置/相同的对象。如果您更改了对象,则所有三个都知道该更改。但是如果你改变其中三个点之一,那对其他两个点无关紧要。
Java非原始变量只是指向实际对象所在的内存地址的指针/引用。没有你作为开发人员必须处理指针可能引起的问题(或访问他们提供的功能)。