技术点:注意Java的java.util.List.subList的坑

java中有一个返回子列表的方法:java

public list<e> subList(int fromIndex, int toIndex){
       subListRangeCheck(fromIndex, toIndex,size);
       return new SubList(this , 0, fromIndex, toIndex);
}

返回一个fromIndex为起点,toIndex为终点(不包含终点)的子列表。从上实现代码中能够看到,先检查一下单签的fromIndex和toIndex是否合法,若是不合法,那么就退出了该函数逻辑。要是合法,能够看出其返回了一个this也就是原始列表的部分元素视图,这样就造成了一个子列表。函数

这也致使了,若是针对原来的list或者是sublist返回的list的修改(这里的修改是不涉及list大小),都是对同一段内存存储的数据作修改。(这种修改叫作非结构修改)测试

若是发生结构性修改的是原来的list(不包括因为返回的子list致使的改变),那么返回的子list语义上将会是undefined。在AbstractList(ArrayList的父类)中,undefined的具体表现形式是抛出一个ConcurrentModificationException。若是你在调用了sublist返回了子list以后,若是修改了原list的大小,那么以前产生的子list将会失效,变得不可以使用。this

特别提醒:在使用sublist部分的白盒测试要重点对上述状况作测试。spa

扩展阅读

相关文章
相关标签/搜索