李说:

ArrayList的subList方法取到的是ArrayList的一段list,只是其中的一段视图。所以修改subList ,ArrayList同时会修改,因为本来就是同一个东西。

jdk文档中是这样说的:

 <> (int fromIndex, int toIndex)
          返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。

补充参考网上资料是这样说的:

1,该方法返回的是父list的一个视图,从fromIndex(包含),到toIndex(不包含)。fromIndex=toIndex 表示子list为空

2,父子list做的非结构性修改(non-structural changes)都会影响到彼此:所谓的“非结构性修改”,是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。

3,对于结构性修改,子list的所有操作都会反映到父list上。但父list的修改将会导致返回的子list失效。

4,tips:如何删除list中的某段数据:

list.subList(from, to).clear();

示例代码:

来自,就是看到这个题目才让我知道list的这个方法我没有接触过

package ques;    import java.util.ArrayList;  import java.util.List;    public class Ques0105 {        public static void main(String[] args) {          List
 list = new ArrayList
();          list.add("a");            // 使用构造器创建一个包含list的列表list1          List
 list1 = new ArrayList
(list);          // 使用subList生成与list相同的列表list2          List
 list2 = list.subList(0, list.size());          list2.add("b");            System.out.println(list.equals(list1));          System.out.println(list.equals(list2));      }  }

返回结果如下:

可以发现,list2为list的子list,当list2发生结构性修改(list2.add("b"))后,list也发生相应改变,所以返回结果为false和true

注意:

引自《阿里巴巴Java开发手册》

【强制】  ArrayList subList 结果不可强转成 ArrayList ,否则会抛出 ClassCastException

异常: java . util . RandomAccessSubList cannot be cast to java . util . ArrayList ;

说明: subList 返回的是  ArrayList 的内部类  SubList ,并不是  ArrayList ,而是

ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。