SubList类
在1.6和1.7的api中没有给出SubList的说明,只有subList方法,返回一个List列表的子类列表
public List<E> subList(int fromIndex,int toIndex)但在jdk的源码中,你可以搜到SubList,它在AbstractList类下,却不是内部类
先看下SubList的结构
SubList继承AbstractList抽象类,AbstractList实现了List接口,所以SubList说到底就是一个List的实现类,主要用于返回List的视图,这个视图是原List对象中的一部分,确实是一部分,直接将原List对象引用到新的子视图的List,对子视图进行改变,原List对象也会随之改变
下面就解释为什么会造成这种情况
首先看SubList中的属性域
SubList有4个自己的属相域和1个继承自AbstractList的modCount
private AbstractList<E> l;
private int offset;
private int size;
private int expectedModCount;
AbstractList l 就是存放母List的那个引用,当List对象(本编中指类似ArrayList的实现List的对象)调用subList方法时候,会调用abstractList中的subList的实现
//AbstractList中的subList方法
public List<E> subList(int fromIndex, int toIndex) {
return (this instanceof RandomAccess ?
new RandomAccessSubList<E>(this, fromIndex, toIndex) :
new SubList<E>(this, fromIndex, toIndex));
}
这里this是多态的,指的是那个外部调用subList方法的那个List对象,先判断this是否实现了RandomAccess接口,实现返回RandomAccessSublist否则返回SubList,通过构造方法将this传给SubList中l属性,在介绍构造方法时细说
int offset 开始子List在母List中的开始位置
int size 记录大小 = toIndex - fromIndex
int expectedModCount 列表的中元素添加、删除的次数,子列表的同步使用
SubList(AbstractList<E> list, int fromIndex, int toIndex) {
if (fromIndex < 0)
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
if (toIndex > list.size())
throw new IndexOutOfBo