您的位置:首页 > 编程语言 > Java开发

ArrayList实现中的SubList

2017-08-02 22:32 239 查看
最近在看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有影响的!

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息