java.util.ConcurrentModificationException java list.subList

原创
2017/04/19 16:46
阅读数 1.2K

背景:
有一个按时间排序的list,想要输出该list的前3条list1和原list按点击排序后结果,然后有了下面代码。
伪代码:

List<Bean> list = ...;
List<Bean> list1 = list.subList(0,4);
Collections.sort(list, new Comparator<Bean> () {
    @Override
    public int compare(Bean o1, Bean o2) {
	//TODO
    }
});
System.out.println(list1);
System.out.println(list);

然后得到类似以下的错误:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231)
	at java.util.ArrayList$SubList.listIterator(ArrayList.java:1091)
	at java.util.AbstractList.listIterator(AbstractList.java:299)
	at java.util.ArrayList$SubList.iterator(ArrayList.java:1087)
	at java.util.AbstractCollection.toString(AbstractCollection.java:454)
	at java.lang.String.valueOf(String.java:2982)
	at java.io.PrintStream.println(PrintStream.java:821)
	at com.blacklist.cotroller.Test.main(Test.java:14)

原因是subList返回的是原list的视图。在使用subList时,对原list或者subList结果的所有非结构性修改都会彼此影响,而如果涉及结构性修改,对subList的修改会影响原list,对原list的修改会使subList为undefined,也就是抛出的异常ConcurrentModificationException。
针对以上情况,可以修改如下。

List<Bean> list = ...;
List<Bean> temp = list.subList(0,4);
List<Bean> list1 = new ArrayList<Bean>(temp);
Collections.sort(list, new Comparator<Bean> () {
    @Override
    public int compare(Bean o1, Bean o2) {
	//TODO
    }
});
System.out.println(list1);
System.out.println(list);

并不是多申奥的知识点,但是也会犯错,记录一下。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部