java中的链表删除
如何在java中完全删除链表。一些教程建议我应该逐点删除它。但如果我简单地将头指向空,这会是错误的吗?因为所有元素都有资格进行垃圾收集。您可以将java中的链表删除,java,linked-list,Java,Linked List,如何在java中完全删除链表。一些教程建议我应该逐点删除它。但如果我简单地将头指向空,这会是错误的吗?因为所有元素都有资格进行垃圾收集。您可以将LinkedList引用变量指向null 任何引用null的引用变量都自动符合垃圾收集的条件 此外,如果执行list.clear()操作,它将清除此列表中的所有元素,但不会清除列表本身 我们也可以调用System.gc(),但是System.gc()不能确保垃圾收集器确实会运行,它只能要求JVM运行gc,但它完全依赖于JVM,所以我们应该将它提升到JVM
LinkedList
引用变量指向null
任何引用null
的引用变量都自动符合垃圾收集的条件
此外,如果执行list.clear()
操作,它将清除此列表中的所有元素,但不会清除列表本身
我们也可以调用System.gc()
,但是System.gc()
不能确保垃圾收集器确实会运行,它只能要求JVM运行gc,但它完全依赖于JVM,所以我们应该将它提升到JVM,只处理gc
有关详细信息,请参阅此Oracle文档,您不能。您只能通过删除对该列表的所有引用来推荐该列表作为垃圾收集的候选对象
如果您拥有唯一的引用,那么将该引用设置为null
将安排对象进行垃圾收集。您可以使用System.gc()
建议垃圾收集,但这不是一种特别好的样式,而且并非所有JVM都支持它
逐节点删除元素(使用clear()
)会有所帮助,因为它会减少每个列表项上保留的引用数。这将减少列表所消耗的内存量。是的,您可以简单地将头
分配为null
,但为了安全起见(如某些节点是从其他地方引用的),最好将所有节点设置为null
如果查看java.util.LinkedList
中的代码,clear()方法也会这样做
/**
* Removes all of the elements from this list.
* The list will be empty after this call returns.
*/
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++;
}
/**
*从此列表中删除所有元素。
*此调用返回后,列表将为空。
*/
公共空间清除(){
//清除节点之间的所有链接是“不必要的”,但是:
//-如果丢弃的节点位于
//不止一代
//-即使存在可访问的迭代器,也确保释放内存
对于(节点x=first;x!=null;){
Node next=x.next;
x、 item=null;
x、 next=null;
x、 prev=null;
x=下一个;
}
first=last=null;
尺寸=0;
modCount++;
}
在您的案例中,第一个
参考是头部
你也可以参考这一点。似乎是对的。。。如果将其设置为null,GC将删除它。。。或者当您离开上下文时,lList.clear()有什么问题?它删除的是值,而不是列表本身。您试图实现什么?我从未在Java中“删除”过变量,坦率地说,我看不出这有什么意义。只需限制变量的范围,您就不必关心这一点。引用null
的引用的可能重复不会指向任何内容,因此无法进行垃圾收集。。。但是新的LinkedList
可以,因为没有更多的引用it@BinkanSalaryman谁告诉你这一点的。这是错误的。检查这里的Oracle链接我实际上是在谈论参考变量,如上面的示例中的list
,它是一个参考变量,最初指LinkedList
,最后指null
/**
* Removes all of the elements from this list.
* The list will be empty after this call returns.
*/
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++;
}