Tôi muốn kiểm tra như thế nào để có được giao nhau giữa hai danh sách, đây là mã của tôi:Danh sách retainAll ngoại lệ
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));
này tạo ra:
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)
Nhưng tôi không làm bất kỳ để loại bỏ việc. Tại sao ngoại lệ sản xuất này?
Cập nhật I:
Sử dụng:
List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = list.subList(2, 5);
Tạo:
java.util.ConcurrentModificationException
Kể từ List2 được hỗ trợ bởi list1, loại bỏ các mục từ list1 sẽ gây ra ngoại lệ này. Phiên bản cuối cùng làm việc:
List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = Arrays.asList(18, 19, 20);
hoặc
List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(18, 19, 20));
hoặc
List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5));
Cám ơn câu trả lời tất cả mọi người của bạn.
'UnsupportedOperationException' - nếu thao tác' retainAll' không được bộ sưu tập này hỗ trợ. – user845279
Sử dụng ví dụ của bạn Tôi nhận được Ngoại lệ trong chuỗi "chính" java.util.ConcurrentModificationException –
Đó là vì bạn đã sử dụng hàm 'subList()'. 'list2' được hỗ trợ bởi' list'. Hàm 'retainAll' sử dụng một trình lặp để xóa các giá trị không giao nhau - điều này gây ra' ConcurrentModificationException'. Bạn có thể đọc về 'Iterator' và sửa đổi đồng thời trên Javadocs. – user845279