Java中子列表的结构性变更是否会同步至原列表?
Java子列表结构性变更是否会同步到原列表?
先看List类中subList方法的文档注释:
/*
The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, and vice-versa.
*/
ListsubList(int fromIndex, int toIndex);
我有个疑问:在Java中,子列表的结构性变更是否会反映到原列表中?我做了实验,结果显示是“会”,但不确定是否正确。
实验代码
public class Main { public static void main(String[] args) { ArrayList<Student> a=new ArrayList<>(); a.add(new Student("Lily",16)); a.add(new Student("Sam",16)); a.add(new Student("Tom",16)); a.add(new Student("Mary",16)); a.add(new Student("Mark",16)); a.add(new Student("John",16)); List<Student> suba=a.subList(2,5); System.out.println("Firstly,suba:"); printall(suba); System.out.println("Change the structure:"); suba.remove(0); System.out.println("suba:"); printall(suba); System.out.println("a:"); printall(a); } public static void printall(List<Student> list){ for (Student a : list){ System.out.print(a+" "); } System.out.println(); } } class Student{ public String name; public int age; public Student(String name,int age){ this.name=name; this.age=age; } public void hello(){ System.out.println("hello"); } @Override public String toString() { return "name :"+this.name+"age :"+this.age; } }
实验结果
Firstly,suba: name :Tomage :16 name :Maryage :16 name :Markage :16 Change the structure: suba: name :Maryage :16 name :Markage :16 a: name :Lilyage :16 name :Samage :16 name :Maryage :16 name :Markage :16 name :Johnage :16
从结果能看到,子列表删除元素后,原列表的结构也变了(Tom被移除),我的这个假设是否正确?
解答
你的假设完全正确,子列表的结构性变更确实会同步到原列表。
这里先明确两个核心概念:
- 非结构性变更:不改变列表大小的操作,比如用
set方法修改某个元素的值 - 结构性变更:改变列表大小的操作,比如
add、remove、clear等方法
虽然文档注释只提到了非结构性变更的双向同步,但实际上subList返回的子列表是原列表的视图——它没有独立的数据存储,所有操作最终都会直接作用在原列表上。不管是结构性还是非结构性变更,操作子列表都会同步影响原列表;反过来,如果直接修改原列表的结构,子列表会立即失效(继续操作会抛出ConcurrentModificationException)。
你的实验里suba.remove(0)本质就是在原列表上执行删除操作,所以原列表中的Tom被移除完全符合预期。
内容的提问来源于stack exchange,提问作者xiunian
相关产品推荐
相关产品推荐

