![fa9d7afd4fede21a87c6939f8c45447c.png](https://i-blog.csdnimg.cn/blog_migrate/83ba552edb5bee770518cdaaf5b4d644.jpeg)
在现实开发中,分割List是常有的事情,首先了解List接口中的sublist方法定义
List subList(int fromIndex, int toIndex);
AbstractList实现了List接口,并实现了List中的sublist方法:
public List subList(int fromIndex, int toIndex) { return (this instanceof RandomAccess ? new RandomAccessSubList<>(this, fromIndex, toIndex) : new SubList<>(this, fromIndex, toIndex));}
如果一个实现类实现了List和RandomAccess接口,它的sublist就返回RandomAccessSubList,否则就返回SubList实例。这里有个特例就是ArrayList,ArrayList重写了父类的sublist,并且返回了一个内部类SubList的实例,这个Sublist和父类的Sublist是两个不同的类。
RandomAccessSubList的类继承关系
![dda636b41648aa51fcd1f2cdf625b988.png](https://i-blog.csdnimg.cn/blog_migrate/c9071551f6c9de20cddc3dede8aaf056.jpeg)
RandomAccessSubList的类继承关系
list.subList() 都不能转成List的具体实现类的实例对象。比如ArrayList的sublist转成ArrayList则会抛出ClassCastException异常:
Caused by: java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList
LinkedList实例的sublist转成LinkedList会抛出ClassCastException异常,但是具体信息不同。
Caused by: java.lang.ClassCastException: java.util.SubList cannot be cast to java.util.LinkedList