[英]Loitering in Java's Linked List Stack implementation
Java的鏈表堆棧實現中是否存在游盪的概念? 在從鏈表中刪除節點之前,是否需要通過將節點的內容設置為null來釋放內存? 還是這樣做不那么好,因為無論如何都不會引用我的舊第一個節點? 謝謝!
public Item pop() {
if (isEmpty())
throw new StackEmptyException("Stack Empty");
Item item = first.item;
first.item = null;
first = first.next;
return item;
}
您的第二個語句是正確的-您無需清除節點,Java GC會處理它。
它確實存在,但您不太可能需要擔心它。
在您的情況下,在first = first.next
,Java GC將識別到first
指向的舊節點現在不可訪問,因此可以進行收集。
假設我們的Node看起來像這樣
private class Node{
Item item;
Node next;
}
您不必為first.item分配null。 當分配first = first.next;時,first.next是一個Node,這意味着它同時具有Item和下一個Node。
游盪是在不再需要對象時保留對其的引用。 在您的情況下,您可以續訂引用,指向堆棧中的下一個項目。
但是,如果我們使用數組,我們的代碼將是:
public Item pop() {
return arrayItems[--N];
}
在這里,我們從堆棧中返回一個Item,但是指針仍然保留,指向我們從堆棧中獲取的元素。 為了避免閑逛,我們將移除的項目條目設置為null:
public Item pop() {
Item item = arrayItems[--N];
arrayItems[N] = null;
return item;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.