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