ArrayList的sublist

ArrayList的方法subList() 分割集合的一段出来使用

demo

List<String> sourceList = new ArrayList<>();
sourceList.add("11");
sourceList.add("22");
sourceList.add("33");
List<String> subList = sourceList.subList(0, 1);

subList 即包含了元素 "11"

1、对父(sourceList)子(subList)List做的非结构性修改(non-structural changes),都会影响到彼此。
如sourceList或者subList调用set()方法修改某个元素,那么父和子集合都会一起改变

如 subList.set(0,"00"); 那么 sourceList 和 subList 索引0的地方元素都为"00"

2、对子List(subList)做结构性修改,操作同样会反映到父List(sourceList)上。
如删除元素(remove),增加(add)元素等都会反映到父List上,父List也会被修改

subList.add("44"); 那么 sourceList 和 subList 索引4的地方元素都为"44"


3、对父List(sourceList)做结构性修改,会抛出异常ConcurrentModificationException
如删除元素(remove),增加(add)元素等都会引起并发异常

sourceList.add("55"); 抛出异常  ConcurrentModificationException

    本质上看,SubList并没有重新创建一个List,而是直接引用了原有的List(返回了父类的视图),
只是指定了一下他要使用的元素的范围而已(从fromIndex(包含),到toIndex(不包含))。

ArrayList底层是实现是数组,sourceList 和 subList都是引用了sourceList内的底层数组,
所以当集合内数据发生改变,都一起改变。


阿里开发手册规定
1 ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常

    解释

此处 List<String> subList = sourceList.subList(0,1);
subList的类型,不是ArrayList的父类那个List
而是ArrayList的内部类,所以subList和ArrayList无继承关系,无法转换


阿里开发手册规定
2 在subList场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除
均产生ConcurrentModificationException 异常

原文地址:https://www.cnblogs.com/hup666/p/11914073.html