-3
public void addToHead(IntNode node) {
    IntNode temp = _head;
    _head = node;
    node.setNext(temp);
}

编辑:我在 youtube 上搜索了关于链表和堆的内容,垃圾收集器何时擦除temp?我知道它应该,但看不到在哪里。

我很难理解它。直觉上我会写

_head = node;

我知道这是不对的,但我觉得我需要了解对象和地址的情况才能明白这一点......

第一行:我创建了一个 temp,并将它指向同一个地址 _head 点
秒行:现在 head 指向地址节点点,(node.next 等于 head.next)
第三行:现在 node.next 变为 temp..
我对吗

4

1 回答 1

0

这工作如下:

  1. node在堆栈上并引用要插入的堆对象 (A)
  2. _head可能是堆对象(列表)的成员,并引用当前位于列表头部的堆对象(B)。
  3. 您在堆栈上创建引用temp,然后它也引用该对象 (B)
  4. 您更改对 所引用_head的堆对象的引用node,因此_head现在引用 (A)
  5. 您现在修改 (A),它同时被_head和引用node,使其具有next-member 引用 (B)
  6. (A) 和 (B) 都至少有一个引用计数,因此 GC 不会在任何一个上运行。
  7. 退出函数后,引用的堆栈内存被回收,并且堆对象只要被引用就一直存在。
  8. 从函数重新调整后,只要您的列表仍然存在,(A)被列表头引用,(B)被(A)的-成员引用next,依此类推,所以没有任何东西被要求通过垃圾收集。
于 2016-06-16T16:45:35.380 回答