在C ++中,您需要手动删除LinkedList中的节点:
Node* node1 = new Node(s);
Node* node2 = new Node(s);
Node* node3 = new Node(s);
node1 -> next = node2;
node2 -> next = node3;
//remove node2 by:
delete node2;
node1 -> next = node3;
对于Java(这是我学习它的前两天),如何自动化 垃圾收集知道何时采取行动?将:
node1.next = node3;
足够吗?
答案 0 :(得分:3)
一旦没有对它的引用在范围内,java中的对象就有资格进行垃圾收集。
所以如果你有一个像这样的单链表
(1) -> (2) -> (3)
并假设head = node 1
然后是的,设置head.next = head.next.next
将允许node 2
在某个时候进行GC。
但是,在您的示例中,在您明确声明
之前,node2
无法消失
node2 = null
以及node1.next = node3
,因为node2
引用会将其保留在范围内。
请注意,node2 = null
实际上并没有对Node
过去指向的node2
对象做任何事情。相反,它只是将引用(因为java中的所有对象都是指针)设置为null。
答案 1 :(得分:2)
Java垃圾收集器PERIODICALLY遍历整个对象引用映射,以查找和删除未引用或循环引用的对象。您可以提示JVM启动垃圾收集的迭代,但是您无法实际指示JVM确定性地进行垃圾收集。
在你的情况下
node1.next = node3;
就足够了,因为node2
将不再有任何引用它的对象
答案 2 :(得分:1)
假设您以不再引用LinkedList
的方式修改node2
,垃圾收集器可以释放其内存。换句话说,node1.next = node3;
应该足够了,假设没有其他对node2
的引用。