2016-08-28 42 views
0

我獨立研究Vanderbilt大學的CS251。這項工作是爲字符數組編寫一個外觀包裝並使其具有可調整大小。但是,有一種方法prune(),我不明白它應該做什麼。你們能否介紹一下這種方法的含義?因爲,我不去那所學校,我不能問任何人。Java:用於Java鏈表的修剪方法

https://github.com/iamparas/CS251/blob/master/assignments/assignment1/ugrad/src/vandy/cs251/CharList.java

這裏,是針對Java代碼的節點。

private class Node { 
    /** 
    * Value stored in the Node. 
    */ 
// TODO - you fill in here 

    /** 
    * Reference to the next node in the list. 
    */ 
// TODO - you fill in here 

    /** 
    * Default constructor (no op). 
    */ 
    Node() { 
    } 

    /** 
    * Construct a Node from a @a prev Node. 
    */ 
    Node(Node prev) { 
     // TODO - you fill in here 
    } 

    /** 
    * Construct a Node from a @a value and a @a prev Node. 
    */ 
    Node(char value, Node prev) { 
     // TODO - you fill in here 
    } 

    /** 
    * Ensure all subsequent nodes are properly deallocated. 
    */ 
    void prune() { 
     // TODO - you fill in here 
     // Leaving the list fully linked could *potentially* cause 
     // a pathological performance issue for the garbage 
     // collector. 
    } 
+0

這是否簡單地「去引用」列表中的每個節點與鏈接的節點? –

回答

1

我提供的答案是簡化的,但我希望從概念上解釋你需要什麼。在Java中,對象被保存在堆中。當垃圾收集發生時,從堆中移除不再由垃圾收集根直接或間接引用的對象。

如果對象仍然被垃圾收集根引用,它將不會被垃圾收集。所有剪枝方法都需要將當前節點之後每個節點的prev和next值設置爲null。這將允許垃圾收集器從堆中移除這些對象。

+0

*如果一個對象仍然被另一個對象引用,它將不會被垃圾收集*:這不是簡化。這只是錯誤的。 –

+0

更新了,是更好的?我的意圖是避免對GC進行太多的細節分析,並強調需要解引用。給我留言,如果事實上不正確,我會將其刪除。感謝您的反饋。 –

+0

好吧,它不再是不正確的,但它仍然意味着將prev節點和下一個節點設置爲null對於GCed對象是必需的。事實是,它根本沒有必要。順便說一句,Java有一個標準的LinkedList方法,它是一個雙向的節點列表,它沒有任何prune()方法。將ref設置爲null *可能有助於GC,但它肯定不是必需的。 –