2012-03-01 71 views
1

如果我有一個變量List.subList是否保留對原始列表的引用?

LinkedList list 

,並多次做以下提取「名單」

// Some operation that adds elements to 'list' 
// max_size = some constant 
list = (LinkedList) list.subList(list.size()-max_size, list.size()); 

做我結束了大量引用到「上一個」列表的尾部?

所以基本上我在這裏要做的是刪除列表的最初部分。

有沒有更好的方法來移除LinkedList的初始段?我認爲LinkedList的數據結構應該允許線性時間(初始段的大小線性被刪除)操作。

回答

3

該代碼將會失敗 - 返回的子列表不是 a LinkedList<T>。樣例程序:

import java.util.LinkedList; 

public class Test { 
    public static void main(String[] args) { 
     LinkedList<String> list = new LinkedList<String>(); 
     list.add("x"); 
     list.add("y"); 
     list = (LinkedList<String>) list.subList(1, 2); 
    } 
} 

輸出:

Exception in thread "main" java.lang.ClassCastException: java.util.SubList 
    cannot be cast to java.util.LinkedList 
    at Test.main(Test.java:8) 

這聽起來像你應該只調用removeFirst多次,因爲你需要:

while (list.size() > maxSize) { 
    list.removeFirst(); 
} 
5

當一切都失敗了,請參閱Javadoc

返回指定 fromIndex(包括)元素範圍,獨家之間的這份名單的一部分的視圖。 (如果fromIndex和 toIndex相等,則返回的列表是空的。)返回的列表是 ,由此列表支持,因此返回的列表 中的非結構更改會反映在此列表中,反之亦然。返回的列表支持 此列表支持的所有可選列表操作。

如果您需要從列表的前面刪除元素,那麼您可以使用removeFirst,並根據需要多次調用它。

+0

其實他想刪除列表的開頭,所以他應該使用'removeFirst()'。 – 2012-03-01 13:13:07

+0

你知道,我無法從他如何解釋他的問題中真實地分辨出來。編輯我的答案。 – Perception 2012-03-01 13:14:07

0

是的,引用的List.subList(int, int)的JavaDoc:

返回指定fromIndex(包括)元素範圍爲排他性之間此列表的所述部分的視圖。 (如果fromIndex和toIndex相等,則返回的列表是空的。)返回列表由此列表支持,因此返回列表中的非結構更改將反映在此列表中,反之亦然。

,你能做些什麼來避免持有舊列表的引用(和可能產生內存泄漏)是一種基於subList創建一個新的實例:

list = new ArrayList(list.subList(list.size()-max_size, list.size())); 

這就是它!與removeFirst()相比,此方法的優勢在於它可與任何List實現一起使用 - removeFirst()僅在LinkedList中定義。

1

要刪除的初始段在Java中列出,請執行:

list.subList(0, numElementsToRemove).clear(); 

這是有效的,因爲子列表由原始列表支持(如Javadoc所述),因此clear()被反映到原始列表的範圍內。

相關問題