subList是List接口中的一个方法,该方法主要返回一个集合中的一段子集,可以理解为截取一个集合中的部分元素,它的返回值也是一个List。
让我们初始化一个例子:
import java.util.ArrayList; import java.util.List;public class SubList_demo {public static void main(String[] args){List<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");list.add("D");list.add("E");List<String> subList = list.subList(0,2);System.out.println(subList);//ArrayList sub_list = list.subList(0,2); } }
运行结果:
但是,subList方法得到的结果是不能转换成ArrayList,Vector,LinkedList等类型,实验如下:
很明显,当我们尝试将list转换成ArrayList时。报错了!!!!!!!
底层原理
subList返回的是一个视图!!!!!!!!!
subList并没有重新创建一个list,而是直接引用了原有的List(返回了父类的视图),只是指定了它要使用的元素的范围而已。
那为什么subList方法得到的集合不能转换为ArrayList呢?原因在于subList只是ArrayList的内部类,它们之间并没有继承关系,所以无法直接进行继承关系的转换。
下面对于视图的概念做一个讲解!!!
非结构性改变
import java.util.ArrayList; import java.util.List;public class SubList_demo {public static void main(String[] args){List<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");list.add("D");list.add("E");List subList = list.subList(0,3);System.out.println("sourceList:" + list);System.out.println("sourceList .subList(0,3) is :" + subList);subList.set(1,"FFF");System.out.println("sourceList:" + list);System.out.println("subList:" + subList);} }
运行结果:
当我们尝试通过set方法改变subList中某个元素的值时,发现,原来的那个List中的对应元素的值也发生了变化!!
同理,如果使用同样的方法修改sourceList中的某个元素,那么subList中的对应的值也会发生改变!
结构性改变
List<String> list = new ArrayList<>();list.add("AAAA");list.add("BBB");list.add("CCCC");list.add("DDDD");list.add("EEE");list.add("FFFF");System.out.println("sourceList:" + list);List subList = list.subList(1,4);System.out.println("subList:" + subList);subList.add("666");System.out.println("***************");System.out.println("sourceList:" + list);System.out.println("subList:" + subList);
运行结果:
当对subList的末尾添加元素时,sourceList的结果也随之发生了改变!!!!
最后,如果对sourceList做修改的话,会抛出异常!!!!