【问题标题】:How is referencing working in Java?引用在 Java 中是如何工作的?
【发布时间】:2017-09-18 00:17:52
【问题描述】:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * } 
 */

          ListNode newNode = null;
          ListNode nxt = head.next;
          head.next = newNode;
          newNode = head;
          head = nxt;

当我看到这个时,这是我想象的:

假设我有一个结构

其中-------> 表示指向(在内存中)

head ------->  1->2->3->4->5->6

那么这意味着

ListNode nxt = head.next -------> 2->3->4->5->6

那么当你这样做时:

head.next = newNode
head -------> 1->NULL

那么nxt不应该变成吗?

nxt ------->  NULL

既然你改变了nxt指向的东西?

【问题讨论】:

  • 但是你没有改变nxt指向的东西。
  • nxt 不指向head.nexthead.nextnxt 是指向同一个对象的单独引用。改变一个不会影响另一个。顺便说一句,为什么是newNode == NULL
  • 用另一种方式表达——= 分配一个引用;它不会修改被引用的对象。
  • 一个更简单的版本,如果这样说,int x=5;int y=x 然后你做x=x+5,你可以检查y 仍然等于5

标签: java memory reference


【解决方案1】:

想象一下:

你有一个红色箭头指向一大堆绿色箭头。

现在找两个朋友,蒙上他们的眼睛,给他们戴上耳机(这样没人能听到你告诉另一个人的话)。我们将称他们为“Tim the guy with a head”和“Bob the next guy”。

拿起蒂姆的手臂,将其指向红色箭头。

现在取下 Bob 的眼罩。告诉他看看蒂姆指着什么,然后指着那个指着的东西。由于 Tim 指向红色箭头,而红色箭头指向绿色箭头,Bob 现在将指向绿色箭头。 现在重新戴上 Bob 的眼罩。

接下来,是时候改变红色箭头所指的地方了,把它旋转 90°,所以现在它什么都没有了。

现在问自己:Bob 指的是什么?

答案显然应该是 Bob 仍然指向绿色箭头。

如果您得出相同的结论:请确保您了解这正是您在问题中描述的情况所发生的情况。

如果您认为 Bob 现在什么都不会指向,我鼓励您在现实生活中尝试一下;)

【讨论】:

    【解决方案2】:

    但您没有更改nxt 指向的位置。

    ListNode nxt = head.next
    

    这使得nxt 指向与head.next 相同的东西,在这种情况下是2。

    head.next = newNode
    

    这改变了head.next。它没有任何改变; nxt 保持原样,并继续指向 2。

    【讨论】:

    • 那如果我这样做:head.next.next = null,它会改变整个结构吗?即现在从任何参考资料来看,我都会有类似1->null 的东西,而不是旧的1->2->3
    • 因为在这种情况下,您正在更改 nxt 指向的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多