subList返回原ArrayList的视图而非副本,add、remove、clear、set等操作会直接同步修改原列表;越界访问抛IndexOutOfBoundsException,原列表结构性修改后调用subList方法可能抛ConcurrentModificationException。

ArrayList 的 subList 方法返回的是原集合的一个**视图(view)**,不是独立副本。对这个子列表的结构性修改(如 add、remove、clear)会**直接反映到原 ArrayList 上**,但前提是操作的是子列表本身,且不违反其范围约束。
哪些操作能修改原集合?
以下操作作用于 subList 返回的对象时,会同步更新原始 ArrayList:
- add(E e):在子列表末尾添加元素 → 原列表对应位置插入
- add(int index, E e):在子列表指定索引处插入 → 原列表对应偏移位置插入
- remove(int index) 或 remove(Object o):删除子列表中的元素 → 原列表中对应元素被移除
- set(int index, E e):替换子列表中某位置的元素 → 原列表该位置元素被覆盖(非结构性修改,但内容同步)
- clear():清空子列表 → 删除原列表中该范围内的所有元素
哪些操作会抛异常?
虽然 subList 是视图,但它有自己严格的索引边界(从 fromIndex 到 toIndex - 1)。越界操作会立即失败:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 调用
subList.get(5)但子列表实际只有 3 个元素 →IndexOutOfBoundsException - 在原 ArrayList 上增删元素,导致 subList 的结构“失效” → 后续调用其任何方法可能触发
ConcurrentModificationException
为什么不能直接 new ArrayList(subList)?
这会创建一个**新副本**,后续修改它不会影响原 ArrayList。例如:
立即学习“Java免费学习笔记(深入)”;
List
List
view.add("x"); // original 变成 ["a", "b", "x", "c", "d"]
List
copy.add("y"); // original 不变
安全使用的建议
- 如果只需读取子范围,用
subList高效又轻量 - 如需修改原集合的某一段,优先用
subList的add/remove/clear - 避免在获取 subList 后,单独修改原 ArrayList 的大小(如 add/remove 元素),否则 subList 可能失效
- 多线程环境下,subList 无额外同步机制,需自行加锁或使用线程安全集合

















