文档章节

java.util.ConcurrentModificationException java list.subList

2水
 2水
发布于 2017/04/19 16:46
字数 326
阅读 31
收藏 0

背景:
有一个按时间排序的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);

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

© 著作权归作者所有

2水
粉丝 6
博文 3
码字总数 778
作品 0
广州
高级程序员
私信 提问
java ArrayList中的subList方法

本文是本人的学习笔记,把自己的理解总结记录下来。因本人水平有限,如果您在阅读中发现错误,还望谅解,并且希望能够告知本人改正,不胜感激! ArrayList中的subList()方法 subList方法传入的...

等到烟火清凉_
2018/07/02
0
0
在Android上做List Remove的时候遇到的异常

目的是从createdList里面找到匹配的pendingStatusList,并将其从pendingStatusList中remove for (DocSyncStatus pendingDss : pendingStatusList) { 上述代码会报异常: java.util.Concurre......

Jerikc
2015/04/28
0
0
【集合类型的并发】Collections.synchronizedList

1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedList 2 :知识背景: 您可能需要了解java Synchronized方法的加锁的各种机制,包括如何上锁,锁对象 3 : ...

止静
2014/08/22
0
2
JBoss Forge 3.2.0.Final 发布

JBoss Forge 3.2.0.Final 发布了。Forge 是一个快速应用开发工具,用来开发 J2EE 应用,提供一个可扩展的插件系统,强大的命令方式等等特性。 值得关注的更新: Support for Class Inherita...

oschina
2016/05/15
738
1
Map迭代过程中remove引发的java.util.concurrentmodificationexception

唉,基础还是不过硬,又在博客记录下一个小问题的解决思路。先贴出出错的代码,大家看看哪里会出问题: [java] view plain copy // 定义的一个map常量 private static final Map<AlarmInfo, ...

onedotdot
2017/10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路。 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源...

别打我会飞
30分钟前
8
0
Zookeeper的实践指南

本章重点 1.数据存储2.基于Java API初探Zookeeper的使用3.深入分析Watcher机制的实现原理4.Curator客户端的使用,简单高效 数据存储 事务日志快照日志运行时日志 bin/zookeepe...

须臾之余
34分钟前
1
0
MySQL mybatis Point类型数据

MySQL中的point用于表示GIS中的地理坐标,在GIS中广泛使用 如何写入mysql,如下图: CREATE TABLE `test-point` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号', `point` ......

张欢19933
45分钟前
2
0
设计模式-适配器模式

适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入...

HOT_POT
今天
17
0
Qt编写自定义控件7-自定义可拖动多边形

前言 自定义可拖动多边形控件,原创作者是赵彦博(QQ:408815041 zyb920@hotmail.com),创作之初主要是为了能够在视频区域内用户自定义可拖动的多个区域,即可用来作为警戒区域,也可用来其他的...

飞扬青云
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部