(转)List.subList带来的ConcurrentModificationException异常

Java List 元素删除 4 种方法对比:从 ConcurrentModificationException 到 removeIf 本文深入解析Java List元素删除的四种方法,包括传统for循环、迭代器删除、倒序循环和Java 8的removeIf,对比其实现原理、性能差异及适用场景。特别针对ConcurrentModificationException异常,提供详细解决方案和实战代码示例,帮助开发者高效安全地操作List集合。 阅读详情

下面内容主要转自下面两篇博文

https://www.jianshu.com/p/59ca14497a12

https://www.jianshu.com/p/d2a69f7dc563

ArrayList$SubList.size方法,如果原List和SubList的modCount不相等就会报错

先贴demo

public static void main(String[] args) {  
        List<Integer> list1 = new ArrayList<Integer>();  
        list1.add(1);  
        list1.add(2);  
          
        //通过subList生成一个与list1一样的列表 list3  
        List<Integer> list3 = list1.subList(0, list1.size());  
        /**
       修改list1  ,也可能是多线程情况下其他线程调用了list1这个实例的add,sort,remove等方法**/
        list1.add(3);  
          
        System.out.println("list1'size:" + list1.size());  
        System.out.println("list3'size:" + list3.size());  
    }  

第二句输出list3.size()就会报这个异常了。

原因是

ArrayList.subList() 方法返回的List是ArrayList中某段数据的一个视图. 因此, 在操作此方法返回的List时, 同样会改变ArrayList的数据. 我们来看看ArrayList.SubList这个类的几个方法就知道了:

public E set(int index, E e) {
    rangeCheck(index);
    checkForComodification();
    E oldValue = ArrayList.this.elementData(offset + index);
    ArrayList.this.elementData[offset + index] = e;
    return oldValue;
}
public E get(int index) {
    rangeCheck(index);
    checkForComodification();
    return ArrayList.this.elementData(offset + index);
}

我们知道ArrayList的内部是用对象数组(成员: elementData)存储数据的, 可以看到ArrayList的内部类SubList的add和get方法操作的就是ArrayList内部的对象数组. 因此对ArrayList.subList()方法的返回值的任何操作都会反映到ArrayList对象本身.

  1. 如果原ArrayList对象有改动, 那么ArrayList.subList()方法返回的视图将会无效. 也就是说在操作ArrayList.subList()方法的返回值前不能对原ArrayList做任何修改, 否则你将得到一个java.util.ConcurrentModificationException异常.

解决方法

public static void main(String[] args) {  
        List<Integer> list1 = new ArrayList<Integer>();  
        list1.add(1);  
        list1.add(2);  
          
        //通过subList生成一个与list1一样的列表 list3  
        List<Integer> list3 = new ArrayList(list1.subList(0, list1.size()));  
        /**
       修改list1  ,也可能是多线程情况下其他线程调用了list1这个实例的add,sort,remove等方法**/
        list1.add(3);  
          
        System.out.println("list1'size:" + list1.size());  
        System.out.println("list3'size:" + list3.size());  
    }  

 也就是将subList返回的列表直接当做ArraList的构造方法参数,就不会报这个异常了。

解密 vn.py 源码:从事件驱动到模块化设计的实战解析 本文深入解析vn.py源码,重点剖析其事件驱动机制与模块化设计。通过事件引擎、处理器字典等核心组件分析,展示如何实现低耦合高内聚的交易系统架构,并结合实战案例说明模块化设计带来的开发效率提升。文章还详细解读了Gateway抽象层、核心数据结构及设计模式应用,为量化交易开发者提供源码级实践指南。 阅读详情

相关推荐

投入产出表之直接消耗系数和完全消耗系数计算--基于Excel

介绍 上篇博客已介绍投入产出表的结构类型及意义解读,在此就不重复写了。 投入产出法中相对稳定的因素是一些系数,根据投入产出表可以计算很多系数: 案例 案例数据即流量矩阵,采用的是中国2012年的部分行业数据,若有不对,请批评指正哈。 直接消耗系数的计算 根据上表和直接消耗系数的计算公式,直接消耗系数矩阵通常用A表示。农林牧渔产品和服务部门对其他部门产品的直接消耗系数分别为: 这些消耗系数的经济意义是,农、林、牧、渔产品和服务部门每生产单位(1亿元)总产出,要直接消耗0.1378亿元本部门产品,0.26

m0_46271335的博客 7万+

关于subList导致的ConcurrentModificationException异常分析

### 由于某老项目中使用的 [BRVAH](https://github.com/CymChad/BaseRecyclerViewAdapterHelper) 为2x版本,所以迁移AndroidX后需要将其一起迁移至3x版本。迁移完毕后运行,发现某页面抛出``ConcurrentModificationException``,在此分析记录一下。

Ipunk_的博客 1131

UFS电源管理实战:如何优化手机存储的功耗与性能(附实测数据)

本文深入探讨了UFS电源管理的实战优化策略,旨在平衡手机存储的功耗与性能。通过解析UFS核心电压域与工作状态,重点介绍了通过动态调整bActiveICCLevel(活动电流等级)来实现精细控制,并结合实测数据与场景驱动的智能策略,为Android系统与硬件工程师提供了降低功耗、提升流畅度的有效方法。

weixin_29214559的博客 504

ConcurrentModificationException异常

需要注意的是,这些解决方案都是针对 ArrayList 的 subList() 方法产生 ConcurrentModificationException 异常的情况,如果使用其他的列表实现或不同的操作,可能需要采取不同的解决方案。如果需要对原列表进行修改,建议直接对原列表进行操作,而不是通过子列表进行操作。使用新的 ArrayList 对象存储子列表元素进行操作:将子列表的元素复制到一个新的 ArrayList 对象中,对这个新的列表进行操作,然后再将操作结果复制回原列表中。

sxp知识共享 1369

波分复用技术原理

波分复用原理 把不同波长的光信号复用到同一根光纤中进行传送,这种方式我们把它叫做波分复用( Wavelength Division Multiplexing ) 一根光纤被划分为多个波道,多个波长以一定的间隔隔开,在光纤中独立传输。 波分复用应用演示 如果将WDM系统看作交通系统,光纤可以看作是多个车道的公用道路。 各种类型的业务就像货物一样,被打包装载到车辆中。 车辆按照分配的车道行驶至目的地,完成货物的运输。 想要提高波分复用系统的传输容量,就要增加波道数量或是提升单波传...

m0_63251770的博客 9997

K-L展开 (Karhunen-Loeve expansion)

K-L变换

susan_wang1的博客 2万+

java List集合之subList()引发的ConcurrentModificationException异常

对List进行subList()操作或subList().clear()连缀操作时,可能会出现以下异常: ConcurrentModificationException 产生的原因:子集合先引用原集合,引用之后再对原集合进行了操作(改变了原集合的结构),此时操作使用子集合就会出现该异常! 解决方案:将子集合拷贝到新集合中,然后直接操作使用该新集合,不要去引用原集合,除非能保证引用的原集合在引用之后不再操作(改变结构)! public static void main(String[] .

♨ 665

从零开始:在Ubuntu 22.04上配置Isaac Gym Preview 3环境(含常见错误解决方案)

本文提供了在Ubuntu 22.04系统上从零开始配置Isaac Gym Preview 3环境的完整实战指南。内容涵盖NVIDIA驱动安装、Conda环境搭建、CUDA与PyTorch版本精准匹配、Isaac Gym核心安装与验证,并重点介绍了针对四足机器人等复杂系统的强化学习训练环境配置、常见错误解决方案及性能调优技巧,旨在帮助开发者高效部署这一高性能物理仿真平台。

weixin_29048775的博客 392

List中subList方法抛出异常java.util.ConcurrentModificationException原理分析

1、首先从测试代码开始: public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0;i<6000;i++){ list.add(i); } List<Integer> list1 = list.s

红目香薰 975

基于STM32设计的数字电子秤

当前项目是采用采用STM32+称重模块+OLED实现了简单的电子秤项目,称重模块上采用24位的ADC芯片,精度较高。实现了称重,校准、去皮等功能。

1万+

详解Agent Skills:让AI拥有更多专业能力(什么是Agent Skills?如何创建?如何使用?如何获取?)

本文分享如何将零散指令沉淀为可复用的 AI 能力模块🧩,介绍什么是Agent Skills?如何创建?如何获取?📚

XiaoqiangClub的博客 1269

ArrayList的subList会出现的异常

【强制】 ArrayList的subList结果不可强转成ArrayList 【阿里巴巴手册规定】 ArrayList的subList结果不可强转成ArrayList,否则会抛出 ClassCastException 异常: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ; 说明: subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是ArrayList 的一个视图,

sxp知识共享 1141

LSTM在交通流量预测中的应用:优化城市交通管理

我们使用的数据集来自某个城市的交通监测系统,包含多个监测点在不同时间段内的交通流量记录。每个监测点的数据包括时间戳、交通流量、天气状况和道路状态等信息。

斌擎科技 1256

别再踩坑了!Java List.subList() 的 3 个隐藏陷阱和 1 个最佳实践

本文深入解析Java List.subList()方法的三大隐藏陷阱:视图陷阱、并发修改陷阱和类型转换陷阱,并提供一个高效实践技巧。通过实际案例和性能对比,帮助开发者避免常见错误,提升代码效率。特别推荐使用subList().clear()进行范围删除操作,显著提升性能。

weixin_30321449的博客 274

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java List.subList相关的ConcurrentModificationException

subList方法返回的List底层使用的仍然是原list,当对原list进行了结构化修改后(例如增加元素或者删除元素),遍历subList将导致异常。 官方文档 The semantics of the list returned by this method become undefined if the backing list (i.e., this list) isstructurally modifiedin any way other than via the returned lis..

NewUser2771894007的博客 335

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Java底层】- List的SubList类

1.SubList类介绍 1.SubList的继承和调用 SubList类继承自AbstractList类,调用AbstracList的subList(fromIndex,toIndex)方法,截取指定位置的子串,返回subList对象。 // AbstractList类 public abstract class AbstractList<E> extends AbstractCo...

qq_39953750的博客 891

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

List的subList产生的异常

List调用subList public void test(){ List<Integer> lists = new ArrayList<>(Arrays.asList(1,2,3,4,5)); System.out.println("1:"+lists); List<Integer> list2 = lists.subList(0,2);

huisiwarmhome的博客 1748

操作list时报java.util.ConcurrentModificationException

这是一个大坑,隐藏的比较隐蔽,有时候还不容易发现,先看我遇到的具体问题: 我对一个list做均匀切割,处理,每次搞到中间就报错,提示: java.util.ConcurrentModificationException 代码大意是这样: for (int i = 0; i < part; i++) { List<Integer> listPage = dataList.subList(0, limit); dataList.add(0);

weixin_42209881的博客 1555

Collection之List---subList

Collection之List—subList Java中一些处理分隔的方法,例如subString—String;subList—List;subMap—Map;subSet—Set; 这里学习并整理了一下关于subList的使用 一、subList仅返回一个list的部分视图 List subList(int fromIndex, int toIndex); 实例: public static...

zym_1321的博客 930

SubList

public static void main(String[] args) {   List<Integer> listOri = new ArrayList<>();   listOri.add(1);   listOri.add(2);   listOri.add(3);   listOri.add(4);   listOri.add(5);    ...

weixin_30802171的博客 182

项目中使用Java中List.subList()的注意事项

在Java中,是接口的一个方法,用于获取原始列表的子列表方法的声明如下toIndex返回的子列表是原始列表的一个视图,对子列表的修改会反映在原始列表上,反之亦然。

m0_63378258的博客 8486

List.subList()方法的坑 以及 如何截短一个List

removeRange(int, int);这个方法AbstractList并没有暴露出来,我们应该如何得到一个截短的list? 1 如何得到一个list某个范围的子集sublist 首先想到sublist(int, int)方法 注意此方法参数左闭右开。 测试如下 1.1 修改sublist会影响原来的list LinkedList<String> ll = new L...

AlbenXie的博客 2316

Java|List.subList 踩坑小记

很久以前在使用 Java 的 List.subList 方法时踩过一个坑,当时记了一条待办,要写一写这事,今天完成它。我们先来看一段代码:// 初始化 list 为 { 1, 2, 3, 4, 5 } List<Integer> list = new ArrayList<>(); for (int i = 1; i <= 5; i++) { list.add(...

靠谱-ing 710

Java中的List.subList方法注意事项

ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException 异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList. 说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList ...

大漠孤烟的博客 3176

java sublist_java 中List.subList 总结

今天,维护以前的代码,看到了List.subList这个方法,以前没接触过,对这个就是个小白,今天学习下:java.util.List中有一个subList方法,用来返回一个list的一部分的视图。它返回原来list的从[fromIndex, toIndex)之间这一部分的视图,之所以说是视图,是因为实际上,返回的list是靠原来的list支持的。所以,你对原来的list和返回的list做的"非结...

weixin_35916106的博客 670

原创 | 为什么阿里巴巴要求谨慎使用ArrayList中的subList方法

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第219篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 集合是Java开发日常开发中经常会使用到的。在之前的一些文章中,我们介绍过一些关于使用集合类应该注意的事项,如《为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作》、《为...

HollisChuang's Blog 1万+
上一篇: Linux命令
下一篇: 连接Redis集群出现Connection refused
AAA821
博客等级 码龄14年 19粉丝 58原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值