赞
踩
List<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
List<String> subList = list.subList(0, 2);
System.out.println(subList); //[111, 222]
ArrayList.subList
返回的是其内部类 SubList 的实例(原始列表的一个视图)。
对原来的list和返回的list做的“非结构性修改”(non-structural changes),都会影响到对方。
所谓的“非结构性修改”是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。
这也很好理解,在Java的继承体系中,父类永远不知道自己有没有/有多少子类。
private class SubList extends AbstractList<E> implements RandomAccess {}
查看继承层次可以知道,Array.SubList
不能强制转换为ArrayList类型。
private class SubList extends AbstractList<E> implements RandomAccess {
private final AbstractList<E> parent; //宿主(原ArrayList)
private final int parentOffset; //
private final int offset; //
int size; //SubList列表的长度
SubList(AbstractList<E> parent,
int offset, int fromIndex, int toIndex) {
this.parent = parent;
this.parentOffset = fromIndex;
this.offset = offset + fromIndex;
this.size = toIndex - fromIndex;
this.modCount = ArrayList.this.modCount;
}
public E set(int index, E e) {
rangeCheck(index); //检查是否越界
checkForComodification(); // 检查modCount
E oldValue = ArrayList.this.elementData(offset + index);
ArrayList.this.elementData[offset + index] = e;
return oldValue;
}
public void add(int index, E e) {
rangeCheckForAdd(index);
checkForComodification();
parent.add(parentOffset + index, e);
this.modCount = parent.modCount;
this.size++;
}
//...
}

我们可以方便的使用如下代码来删除某个区间的序列。
list.subList(from, to).clear();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。