记一次踩坑ConcurrentModificationException

在这里插入图片描述
这段代码中,oDo 是一个 List 类型的对象,subbedList 是从 oDo 中通过 subList(0, 3) 方法获取的子列表。subList 方法返回的是原列表 oDo 的一个视图,而不是一个独立的列表。这意味着对 subbedList 的任何修改都会反映到 oDo 上,反之亦然。

以下是代码的执行流程:

  1. Collections.sort(oDo, (o1, o2) -> o2.getCreateTime().compareTo(o1.getCreateTime())); 这行代码对 oDo 列表进行排序,排序的依据是每个对象的 getCreateTime() 方法返回的值。

  2. 如果有相关单位超过三个,会抛出异常。

  3. List<FileProcessResultDO> subbedList = oDo.subList(0, 3); 这行代码获取 oDo 列表的前三个元素,并将其存储在 subbedList 中。

  4. oDo.clear(); 这行代码清空了 oDo 列表。

  5. subbedList.forEach(r->oDo.add(r)); 这行代码将 subbedList 中的元素重新添加到 oDo 列表中。

问题在于,subbedListoDo 的一个视图,所以当 oDo.clear() 被调用时,oDo 被清空,同时 subbedList 也失去了它原本包含的元素,因为它只是 oDo 的一个子视图。这就是为什么 oDo 使用 clear 方法会影响 subbedList 的原因。

为了避免这个问题,你可以在清空 oDo 之前,先创建一个新的列表来存储 subbedList 的元素,如下所示:

List<FileProcessResultDO> subbedList = new ArrayList<>(oDo.subList(0, 3));
oDo.clear();
subbedList.forEach(r -> oDo.add(r));

这样,即使 oDo 被清空,subbedList 中的元素也不会受到影响,因为它已经复制到了一个新的列表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值