ArrayList实现中的SubList

本文详细解析了JDK源码中ArrayList的SubList实现机制。SubList作为ArrayList的一个内部类,其所有操作均直接作用于父类,从而影响原始列表。文章通过具体代码示例展示了如何添加和移除元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看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有影响的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值