最近在看JDK源码,看到ArrayList.java这个实现的时候,发现里面有一个SubList子类,这个类里是直接操作父类元素的,所以会对父类产生影响,可能以后会用错,在这里记下来。
源码里面,ArrayList类中有下面这么个方法可以获取到ArrayList的一个子列表
public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, 0, fromIndex, toIndex); }返回的SubList是ArrayList的一个子类,源码片段如下:...private class SubList extends AbstractList<E> implements RandomAccess { private final AbstractList<E> parent; private final int parentOffset; private final int offset; int size; 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; }...可以看到这个子类继承了AbstractList所以其实它也是一个List类型,但是它里面的操作都是针对父List的,源码里面是这么写的:...public void add(int index, E e) { rangeCheckForAdd(index); checkForComodification(); parent.add(parentOffset + index, e); this.modCount = parent.modCount; this.size++; } public E remove(int index) { rangeCheck(index); checkForComodification(); E result = parent.remove(parentOffset + index); this.modCount = parent.modCount; this.size--; return result; }...上面的操作都是直接调用了父List的方法,只不过对应的offset不一样,所以肯定是会对原List有影响的!