我想測試如何在兩個列表之間的交叉點獲得,這裏是我的代碼:列表中的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));
謝謝您的回答大家。
'UnsupportedOperationException' - 如果該集合不支持'retainAll'操作。 – user845279
使用你的例子我在線程「main」中得到異常java.util.ConcurrentModificationException –
這是因爲你使用了'subList()'函數。 'list2'由'list'支持。 'retainAll'函數使用迭代器刪除非相交值 - 這會導致'ConcurrentModificationException'。你可以閱讀關於'Iterator'和Javadocs的併發修改。 – user845279