为什么会单独提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<E> it = listIterator(fromIndex);
for (int i=0, n=toIndex-fromIndex; i<n; i++) {
it.next();
it.remove();
}
}
发现这里才是具体的方法实现,其它三个地方都是通过这里来具体实现的。如果你想要使用ArrayList的removeRange方法,可以直接写一个list类,继承ArrayList,然后就可以使用它的removeRange方法了。
为什么removeRange方法是protected
看了一些资料和文章后,发现这篇文章解释的还可以
为什么 Java 的 AbstractList 的 removeRange() 方法受到保护?