簡體   English   中英

Java中的鏈表刪除

[英]linked list deletion in java

如何在Java中完全刪除鏈表。 一些教程建議我應該逐個節點刪除它。 但是,如果我只是簡單地將其設置為null,那會錯嗎? 由於所有元素都符合垃圾收集的條件。

你不能 您只能通過刪除對列表的所有引用來推薦該列表作為垃圾收集的候選對象。

如果您擁有唯一的引用,則將該引用設置為null將安排該對象進行垃圾回收。 您可以建議使用System.gc()進行垃圾回收,但這並不是特別好的樣式,並且並非所有的JVM都支持它。

逐個節點刪除元素(使用clear()有所幫助,因為這將減少每個列表項上保存的引用數量。 這將減少列表占用的內存量。

您可以將LinkedList參考變量指向null

任何引用null引用變量都自動符合垃圾回收條件

List list = new LinkedList();
list.add("hi");
list = null; // now eligible for *Garbage Collection*, leave it for JVM to handle

而且,如果您執行list.clear() ,它將清除此list所有元素,但不清除list本身。

我們也可以調用System.gc()但是System.gc()不能確保Garbage Collector可以正常運行,它只能要求JVM運行GC,而完全依賴JVM,因此我們應該對其進行征收JVM僅處理GC。

有關更多信息,請參見此處的 Oracle文檔

是的,您可以簡單地將head分配為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++;
}

first參考是head在你的情況。

您也可以參考此綜合答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM