【发布时间】:2018-02-13 22:58:06
【问题描述】:
我有一堂课:
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
打印LinkedList的功能是:
public static void printLinkedNode(ListNode l){
while(l != null){
System.out.print(l.val+" ");
l = l.next;
}
System.out.println(" ");
}
在我的主函数中,我创建了一个名为 test 的 ListNode:
ListNode test = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
如果我做一个:
ListNode fast = head, slow = head;
fast = fast.next.next;
printLinkedNode(head); // I get 1->2->3->4
如果我做 B:
ListNode fast = head, slow = head;
fast.next = fast.next.next;
printLinkedNode(head); // I get 1->3->4
我很困惑为什么在 A 中,头部是 1->2->3->4,而不是 3->4?我已经阅读了一些关于Is Java “pass-by-reference” or “pass-by-value”? 的帖子,但仍然无法弄清楚..
如果我做 C:
ListNode fast = head, slow = head;
fast = fast.next.next;
printLinkedNode(fast); //3->4
printLinkedNode(head); //1->2->3->4
fast.next = new ListNode(5);
printLinkedNode(fast); //3->5
printLinkedNode(head); //1->2->3->5, why the head will change?
我很困惑为什么当我们做 fast.next = new ListNode(5); 时头部会改变我认为快速不是用头部分配的吗?
【问题讨论】:
-
head仍然引用同一个对象。在 A 中,您让fast引用与head相同的实例,然后将该引用更改为下一个节点,同时保持引用head不变。 Java 是按值传递的,因为引用的“值”被复制和传递(不是引用的地址或指向引用的指针)。将 Java 引用视为某种指针:fast = head表示您有两个“指针”指向同一个地址(它们具有相同的值),当您执行fast = xxx时,您让fast指向其他地址(您只更改该指针的值)。