2015-07-10 50 views
4

我試圖削減兩半的ArrayList<String>List.sublist(n,m)的視圖是什麼?

ArrayList<String> in = new ArrayList<>(), out1, out2; 
out1 = (ArrayList<String>) in.subList(0,2); //will cause an ClassCastException: List cannot be casted to ArrayList 
out2 = (ArrayList<String>) in.subList(2,5); // either here 

爲什麼?什麼是視圖表示,哪個subList返回?

回答

3
ArrayList

subList方法返回一個內部類的ArrayList稱爲SubListprivate class SubList extends AbstractList<E> implements RandomAccess),而不是一個ArrayList的實例。您可以將其存儲在List變量中,但不能將其轉換爲ArrayList

如果你希望你的子列表是一個獨立的ArrayList中,你可以創建一個新的ArrayList:

out1 = new ArrayList<String> (in.subList(0,2)); 
out2 = new ArrayList<String> (in.subList(2,5)); 
+0

所以它是沒有ArrayList的既不是鏈表?子列表如何在內存中表示? – Joel

+1

@Joel它由原始的ArrayList支持。 – Eran

+0

爲什麼不僅僅是一個arrayList的實例? - 沒有返回原始類型的好處是什麼? – Joel