栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ArrayList源码学习---removeRange方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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,所以最终,它调用的还是AbstractList的removeRange方法。

然后再来看看 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,所以这里还是调用的AbstractList的removeRange方法。

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

protected void removeRange(int fromIndex, int toIndex) {
        ListIterator it = listIterator(fromIndex);
        for (int i=0, n=toIndex-fromIndex; i 

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

为什么removeRange方法是protected

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/310339.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号