java.util.ConcurrentModificationException java list.subList错误

IT黑名单 2017-3-8 10:50:53

背景:
有一个按时间排序的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);
并不是多申奥的知识点,但是也会犯错,记录一下。


转载请注明来源【IT黑名单

本文链接:http://blog.itblacklist.cn/20170308/8447.html

© Copyright 2016 IT黑名单 Inc.All Rights Reserved. 豫ICP备15018592号-2