上一题下一题

Java `ArrayList` 的 `subList` 修改为何会影响原集合并可能触发 `ConcurrentModificationException`:说明视图语义与结构性修改边界

进阶版
来源:bytedance高级工程师
草稿该题目为草稿状态,前台公开题库中不可见。
答案解析

Java 里 ArrayList.subList(from, to) 返回的不是一个新的独立集合,而是原 ArrayList 的一个 视图 。

也就是说,subList 底层还是引用原集合的数组,只是维护了自己的起始偏移量、长度等信息。所以对子列表做修改,本质上是在修改原集合对应区间的数据。

比如:

这里 sub.set(0, 20) 实际修改的是原集合下标 1 的元素,所以原集合会被影响。

ConcurrentModificationException 的原因主要和 modCount 有关。ArrayList 内部有一个 modCount 字段,用来记录集合发生结构

登录后查看完整内容