有人知道为什么AbstractList(以及ArrayList)中的removeRange方法是protected
吗?它看起来是一个非常明确和有用的操作,但是为了使用它,我们被迫子类化List实现。
是否有一些隐藏的理由?对我来说似乎相当难以理解。
有人知道为什么AbstractList(以及ArrayList)中的removeRange方法是protected
吗?它看起来是一个非常明确和有用的操作,但是为了使用它,我们被迫子类化List实现。
是否有一些隐藏的理由?对我来说似乎相当难以理解。
是的,因为那不是你从外部代码中删除范围的方法。相反,应该这样做:
list.subList(start, end).clear();
这实际上在后台调用了removeRange
.†
问题提出者问为什么removeRange
不是List
公共API的一部分。原因在于Effective Java第二版的第40条中描述,我在此引用:
有三种技术可以缩短过长的参数列表。其中之一是将方法拆分成多个子方法,每个子方法只需要参数的一个子集。如果处理不当,这可能会导致太多的方法,但它也可以通过增加正交性来帮助减少方法数量。例如,考虑
java.util.List
接口。它没有提供在子列表中查找元素的第一个或最后一个索引的方法,这两个方法都需要三个参数。相反,它提供了subList
方法,它接受两个参数并返回子列表的视图。该方法可与indexOf
或lastIndexOf
方法结合使用,这两个方法都只有一个参数,以产生所需的功能。此外,subList
方法可以与对List
实例执行的任何方法组合,以在子列表上执行任意计算。由此产生的API具有非常高的功率重量比。
可以争辩removeRange
没有那么多的参数,因此可能不是这种方法的候选者,但考虑到有一种通过subList
调用removeRange
的方式,没有理由在List
接口中增加冗余的方法。
该方法由
clear
操作在该列表及其子列表上调用。重写此方法以利用列表实现的内部机制可以显著地改善该列表及其子列表上的clear
操作的性能。
另请参见OpenJDK的AbstractList.clear
和SubList.removeRange
实现。
AbstractList.clear
和SubList.removeRange
。 :-) - C. K. YoungArrayList
版本的范围跨越整个列表时,removeRange
不必要地调用了arraycopy
?http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/classes/java/util/ArrayList.java#l631numMoved
为0,因此整个arraycopy
代码可以放入单个if
中(与remove
中所做的相同);区别在于a)arraycopy
是本机调用,会产生开销,b)`arraycopy总是检查参数的正确性。 https://dev59.com/x2cs5IYBdhLWcg3ww2tP - user719662