sublist返回原arraylist的视图而非新集合,修改子列表会同步影响原列表,且不支持add/remove操作;需独立副本时应使用new arraylist(list.sublist(from, to))。

Java 中用 subList 截取 ArrayList 子集,本质是返回原列表的**视图(view)**,不是新集合。这意味着修改子列表会影响原列表,反之亦然;同时它不支持增删操作,否则会抛 UnsupportedOperationException。
subList 的基本用法和参数规则
subList(int fromIndex, int toIndex) 返回从 fromIndex(含)到 toIndex(不含)的子列表。注意:
-
fromIndex必须 ≥ 0,toIndex必须 ≤ 原列表大小 -
fromIndex不能大于toIndex,否则抛IllegalArgumentException - 空列表调用
subList(0, 0)是合法的,返回空子列表
修改子列表会同步影响原列表
因为 subList 不复制数据,只是共享底层数组引用:
例如:
ArrayList<string> list = new ArrayList(Arrays.asList("a", "b", "c", "d"));
List<string> sub = list.subList(1, 3); // ["b", "c"]
sub.set(0, "X"); // 修改子列表第一个元素
System.out.println(list); // 输出 [a, X, c, d] —— 原列表已变</string></string>
想得到真正独立的子集?要手动拷贝
如果需要可增删、与原列表完全隔离的副本,不能直接用 subList,而应构造新 ArrayList:
- 安全写法:
new ArrayList(list.subList(from, to)) - 也可用
ArrayList.copyOf(list.subList(from, to))(JDK 10+) - 避免直接使用
subList结果作为长期存储或传给不可信方法
常见陷阱:add/remove 操作会报错
subList 返回的是 RandomAccessSubList(内部类),它重写了 add、remove、clear 等方法,统一抛异常:
例如:
List<string> sub = list.subList(0, 2);
sub.add("e"); // 抛 UnsupportedOperationException</string>
如需增删,必须先转成新 ArrayList 再操作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











