将节点添加到LinkedList时,幕后(堆,堆栈等)会发生什么?

时间:2016-06-16 16:19:38

标签: java object linked-list heap aliasing

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

编辑:我搜索了youtube,Nothig那里有关于链表和堆的信息 垃圾收集器何时擦除temp?我知道它应该,但无法看到。

我很难理解它。直觉我只是写

_head = node;

我知道这不对,但我觉得我需要了解那里的对象和地址,以明白这一点......

第一行:我创建一个temp,并将其指向同一个地址_head points
秒行:现在指向地址节点,(node.next等于head.next)
第三行:现在node.next变为临时..
我是对的

1 个答案:

答案 0 :(得分:0)

其工作原理如下:

  1. node在堆栈上并引用要插入的堆对象(A)
  2. _head可能是堆对象(列表)的成员,并引用当前位于列表头部的堆对象(B)。
  3. 您在堆栈上创建引用temp,然后引用该对象(B)
  4. 您将引用_head更改为node引用的堆对象,因此_head现在引用(A)
  5. 您现在修改({1),_headnode引用,以使其next - 成员参考(B)
  6. (A)和(B)的引用计数始终至少为1,因此GC不会在任何一个上运行。
  7. 退出函数后,将回收引用的堆栈内存,并且堆对象只要引用它们就会持久存在。
  8. 从函数重新调用后,只要列表仍然存在,(A)由列表头引用,(B)由(A)的next - 成员引用,依此类推等等,所以垃圾收集没有任何声明。