ArrayList的subList返回原列表的视图而非独立副本,修改子列表元素会影响原列表;其索引范围为左闭右开,越界抛IndexOutOfBoundsException;不支持add、remove等结构性修改,否则抛UnsupportedOperationException;需独立副本时应显式创建新ArrayList或使用List.copyOf。

Java 中 ArrayList 的 subList 方法可以快速获取子列表,但它返回的是原列表的**视图(view)**,不是独立副本——修改子列表会同步影响原列表,这点必须特别注意。
基本用法:指定起始和结束索引
subList(fromIndex, toIndex) 返回从 fromIndex(含)到 toIndex(不含)的左闭右开区间子列表。两个索引都必须在 [0, size()] 范围内,否则抛 IndexOutOfBoundsException。
例如:
ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d", "e"));
List<String> sub = list.subList(1, 4); // ["b", "c", "d"]
⚠️ 关键限制:不能直接修改子列表结构
subList 返回的是 List 接口实例,但不支持结构性修改操作(如 add、remove、clear),否则会抛 UnsupportedOperationException。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- ✅ 允许:
set(i, e)(替换元素)、get(i)、size() - ❌ 不允许:
add(e)、remove(i)、addAll(...)、clear()
需要真正独立副本?手动创建新 ArrayList
如果希望子列表与原列表完全解耦(增删改互不影响),必须显式构造新集合:
new ArrayList(list.subList(from, to))- 或 Java 10+:
List.copyOf(list.subList(from, to))(不可变副本) - 或使用 Stream(适合复杂处理):
list.subList(from, to).stream().collect(Collectors.toList())
原列表变动会影响 subList?是的,要小心
subList 是动态视图。若在获取子列表后,对原 ArrayList 进行 add 或 remove 操作(尤其在子列表范围附近),再访问子列表可能触发 ConcurrentModificationException。
安全做法:
- 避免在获取
subList后继续修改原列表 - 如需后续修改,优先先复制一份独立副本
- 调试时留意迭代子列表过程中的原列表变更

















