ArrayList源码学习---removeRange方法

为什么会单独提removeRange方法

因为在查看ArrayList源码中,发现了removeRange方法,在此之前,工作中经常用到ArrayList,对于删除,好像只有remove方法,或者使用subList来进行删除,的确重来没有用过removeRange方法,首先先来看看removeRange方法的源码:

protected void removeRange(int fromIndex, int toIndex) {
        modCount++;
        int numMoved = size - toIndex;
        System.arraycopy(elementData, toIndex, elementData, fromIndex,
                         numMoved);

        // clear to let GC do its work
        int newSize = size - (toIndex-fromIndex);
        for (int i = newSize; i < size; i++) {
            elementData[i] = null;
        }
        size = newSize;
    }

看到这里的时候,第一反应,就是这里没有涉及到索引的检测,而是直接进行了数据的操作,所以,我先想到的是,作者难道在设计这个方法的时候没有考虑到索引的问题吗?自己冷静下来想了一下,好像自己也没有用到过这个方法,然后就去写了一个demo,发现确实没有这个方法可以调用:
在这里插入图片描述
看到这里就去重新回去看了一下代码,发现这个方法是protected的,受到保护的,所以,我们在使用ArrayList的时候不能调用这个方法。我就去看具体ArrayList本身有没有那个方法调用了removeRange这个方法,就发现:
在这里插入图片描述
有三个地方调用了这个方法,其中这个三个方法,实际调用的是父类的removeRange

我就看了ArrayList.SubList中的removeRange方法:

protected void removeRange(int fromIndex, int toIndex) {
            checkForComodification();
            parent.removeRange(parentOffset + fromIndex,
                               parentOffset + toIndex);
            this.modCount = parent.modCount;
            this.size -= toIndex - fromIndex;
        }

这里它使用的是parent.removeRange,它继承的是AbstractList,所以最终,它调用的还是AbstractListremoveRange方法。

然后再来看看 SubList中的removeRange方法:

protected void removeRange(int fromIndex, int toIndex) {
        checkForComodification();
        l.removeRange(fromIndex+offset, toIndex+offset);
        this.modCount = l.modCount;
        size -= (toIndex-fromIndex);
    }

这里使用的是l.removeRange,通过前面代码查看,我知道了这个l是指的AbstractList,所以这里还是调用的AbstractListremoveRange方法。

最后我们再来看看AbstractList本身的removeRange方法:

protected void removeRange(int fromIndex, int toIndex) {
        ListIterator<E> it = listIterator(fromIndex);
        for (int i=0, n=toIndex-fromIndex; i<n; i++) {
            it.next();
            it.remove();
        }
    }

发现这里才是具体的方法实现,其它三个地方都是通过这里来具体实现的。如果你想要使用ArrayListremoveRange方法,可以直接写一个list类,继承ArrayList,然后就可以使用它的removeRange方法了。

为什么removeRange方法是protected

看了一些资料和文章后,发现这篇文章解释的还可以
为什么 Java 的 AbstractList 的 removeRange() 方法受到保护?

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值