仅通过使 head = null 删除单个链表?
Deleting a single linked list by just making head = null?
为什么我不能让 head=null
删除完整的链表?
3 = head > 1 > 2 > 4 > null
通过设置 head = null
,JVM 将处理 it.As 头节点未被任何变量引用,它应该被垃圾收集。
这个解决方案有什么问题?
注意:我知道删除完整 link 列表的正确解决方案,但我很好奇为什么我不能让 head=null
删除完整 link 列表?
这里是 java.util.LinkedList.clear() 的代码,逐字:
public void clear() {
// Clearing all of the links between nodes is "unnecessary", but:
// - helps a generational GC if the discarded nodes inhabit
// more than one generation
// - is sure to free memory even if there is a reachable Iterator
for (Node<E> x = first; x != null; ) {
Node<E> next = x.next;
x.item = null;
x.next = null;
x.prev = null;
x = next;
}
first = last = null;
size = 0;
modCount++;
}
评论回答了你的问题。这是不必要的。但是它可以帮助 GC,如果有一个 Iterator 引用其中一个节点,它可以让更多的对象更快地符合 GC 的条件:被引用的节点仍然不符合 GC 的条件,但是被引用之前和之后的所有节点节点将是,因为它们不再被引用。
请注意,开发人员选择使 clear() 方法变慢(O(n) 而不是 O(1)),以使 GC 更快并减少 "memory leaks"。你可以做相反的选择。
另请注意,您可能永远不会调用 clear(),而只是停止引用 LinkedList 类型的对象,而将所有节点链接在一起。如果 none 个节点可以通过来自 GC 根的引用链访问,则 GC 将收集所有节点。这就是您使用列表时 99% 的情况。
为什么我不能让 head=null
删除完整的链表?
3 = head > 1 > 2 > 4 > null
通过设置 head = null
,JVM 将处理 it.As 头节点未被任何变量引用,它应该被垃圾收集。
这个解决方案有什么问题?
注意:我知道删除完整 link 列表的正确解决方案,但我很好奇为什么我不能让 head=null
删除完整 link 列表?
这里是 java.util.LinkedList.clear() 的代码,逐字:
public void clear() {
// Clearing all of the links between nodes is "unnecessary", but:
// - helps a generational GC if the discarded nodes inhabit
// more than one generation
// - is sure to free memory even if there is a reachable Iterator
for (Node<E> x = first; x != null; ) {
Node<E> next = x.next;
x.item = null;
x.next = null;
x.prev = null;
x = next;
}
first = last = null;
size = 0;
modCount++;
}
评论回答了你的问题。这是不必要的。但是它可以帮助 GC,如果有一个 Iterator 引用其中一个节点,它可以让更多的对象更快地符合 GC 的条件:被引用的节点仍然不符合 GC 的条件,但是被引用之前和之后的所有节点节点将是,因为它们不再被引用。
请注意,开发人员选择使 clear() 方法变慢(O(n) 而不是 O(1)),以使 GC 更快并减少 "memory leaks"。你可以做相反的选择。
另请注意,您可能永远不会调用 clear(),而只是停止引用 LinkedList 类型的对象,而将所有节点链接在一起。如果 none 个节点可以通过来自 GC 根的引用链访问,则 GC 将收集所有节点。这就是您使用列表时 99% 的情况。