sublist返回原列表的实时视图而非副本,修改会影响原列表;调用格式为list.sublist(fromindex, toindex),含头不含尾,索引需满足0≤fromindex≤toindex≤size。

ArrayList 的 subList 方法返回的是原列表的“视图”,不是独立副本,修改它会影响原列表,这点必须特别注意。
subList 基本用法和参数含义
调用格式为 list.subList(fromIndex, toIndex),其中:
- fromIndex 是起始索引(包含),从 0 开始
-
toIndex 是结束索引(不包含),即取到
toIndex - 1位置 - 两个索引都必须满足
0 ≤ fromIndex ≤ toIndex ≤ list.size(),否则抛IndexOutOfBoundsException
subList 返回的是“活”的视图,不是新 ArrayList
返回的对象是 ArrayList 内部的 SubList 类实例,它直接引用原列表的元素数组:
- 对 subList 调用
add()、remove()、set()等操作,会同步反映到原 ArrayList 上 - 原 ArrayList 结构变化(如增删元素)可能导致 subList 抛
ConcurrentModificationException - 想获得真正独立的子集,需显式构造新 ArrayList:
new ArrayList(list.subList(1, 4))
常见误用与安全建议
容易踩坑的操作包括:
- 把 subList 赋值给
ArrayList变量(编译失败),应使用List接口类型 - 在多线程环境下直接共享 subList(线程不安全)
- 原列表被其他代码修改后,再操作 subList(可能触发快速失败机制)
- 需要长期持有或后续修改时,务必用
new ArrayList(...)复制一份
一个典型示例
假设 ArrayList<string> list = new ArrayList(Arrays.asList("a", "b", "c", "d", "e"));</string>:
-
list.subList(1, 4)返回["b", "c", "d"] -
list.subList(0, 0)返回空列表(合法) -
list.subList(2, 2).add("x")会在原列表索引 2 处插入 "x",list 变成["a","b","x","c","d","e"]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











