此篇讲解为什么要慎用List.subList(),拆分集合应该使用什么方式
一、我们先添加一组个集合,然后使用subList拆分出一个集合
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("list==1");
list.add("list==2");
list.add("list==3");
list.add("list==4");
list.add("list==5");
System.out.println("list:" + list);
List<String> subList = list.subList(2, 4);
System.out.println("subList:" + subList);
}
subList从第二位开始截取,截取到第四位,来看一下subList的值

似乎一切正常!那么我们在subList之后将list的值修改,看结果
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("list==1");
list.add("list==2");
list.add("list==3");
list.add("list==4");
list.add("list==5");
System.out.println("list:" + list);
List<String> subList = list.subList(2, 4);
list.set(2, "list==3==update");
System.out.println("subList:" + subList);
}

我们在subList之后将list中下标为2的数据(第三个)修改为:"list==3==update",常理来说此时subList已经是一个新集合,没有改动数据应该不会发生变化,但是结果中却显示subList的值也发生了变化。
原因:
所以执行
为了证实这一点,我们再修改sunList的值
List<String> list = new ArrayList<>();
list.add("list==1");
list.add("list==2");
list.add("list==3");
list.add("list==4");
list.add("list==5");
List<String> subList = list.subList(2, 4);
subList.add("list==5==subList");
System.out.println("list:" + list);
System.out.println("subList:" + subList);

可以看出list的值也被修改
看一下ArrayList中的subList方法


可以看出来,ArrayList的subList方法返回了SubList类,SubList这个类最终也实现了List接口
还有如果subList的toIndex超出了原list的大小会抛出IndexOutOfBoundsException异常
最后如果要拆分list尽量使用Stream处理
// skip:过2个元素、limit:取2个元素
List<String> skipList = list.stream().skip(2).limit(10).collect(Collectors.toList());