2012-05-10 56 views
7

我想測試如何在兩個列表之間的交叉點獲得,這裏是我的代碼:列表中的retainAll例外

  List<Integer> list = Arrays.asList(16, 17, 18, 19, 20); 
     List<Integer> list2 = list.subList(2, 5); 

     System.out.println(list.subList(2, 5)); 
     System.out.println(list.containsAll(list.subList(2, 5))); 
     System.out.println(list.retainAll(list2)); 

這將產生:

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.remove(Unknown Source) 
    at java.util.AbstractList$Itr.remove(Unknown Source) 
    at java.util.AbstractCollection.retainAll(Unknown Source) 
    at gov.noaa.nhc.App.main(App.java:48) 

但我沒有做任何排除。爲什麼這會產生異常?

更新我:

使用:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = list.subList(2, 5); 

產地:

java.util.ConcurrentModificationException 

由於列表2由list1的支持下,從列表1移除項將導致此異常。最後工作版本:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = Arrays.asList(18, 19, 20); 

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(18, 19, 20)); 

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5)); 

謝謝您的回答大家。

回答

16

當你使用Arrays.asList時,你會得到一個列表,由實際數組支持的具有受限功能的列表。如果你想要一個完全可修改的列表,你必須創建一個新列表。例如:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5)); 
list.retainAll(list2); 
System.out.println(list); 
// result: [18, 19, 20] 
+0

'UnsupportedOperationException' - 如果該集合不支持'retainAll'操作。 – user845279

+0

使用你的例子我在線程「main」中得到異常java.util.ConcurrentModificationException –

+0

這是因爲你使用了'subList()'函數。 'list2'由'list'支持。 'retainAll'函數使用迭代器刪除非相交值 - 這會導致'ConcurrentModificationException'。你可以閱讀關於'Iterator'和Javadocs的併發修改。 – user845279

0

retainAll會刪除不在給定列表中的所有元素。

3

作爲documentation說,該方法List.retainAll()

僅保留在該列表中包含的指定集合(可選操作)中的元素。換句話說,從此列表中刪除未包含在指定集合中的所有元素。 [重點礦]

0

文檔還指出,當List實現不支持此方法時,retainAll拋出UnsupportedOperationException。