Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java';s摘要列表';s removeRange()方法是否受保护?_Java_List_Collections_Arraylist_Protected - Fatal编程技术网

为什么Java';s摘要列表';s removeRange()方法是否受保护?

为什么Java';s摘要列表';s removeRange()方法是否受保护?,java,list,collections,arraylist,protected,Java,List,Collections,Arraylist,Protected,有人知道为什么中(以及中)的removeRange方法受保护吗?它看起来是一个定义良好且非常有用的操作,但为了使用它,我们不得不对列表实现进行子类化 是否有一些隐藏的理由?对我来说似乎很难理解。是的,因为这不是从外部代码中删除范围的方式。相反,请执行以下操作: list.subList(start, end).clear(); 这实际上是在幕后调用removeRange。† OP询问为什么removeRange不是列表公共API的一部分。原因见有效Java第二版第40项,我在此引用: 缩短过

有人知道为什么中(以及中)的removeRange方法受保护吗?它看起来是一个定义良好且非常有用的操作,但为了使用它,我们不得不对列表实现进行子类化


是否有一些隐藏的理由?对我来说似乎很难理解。

是的,因为这不是从外部代码中删除范围的方式。相反,请执行以下操作:

list.subList(start, end).clear();
这实际上是在幕后调用
removeRange
。†


OP询问为什么
removeRange
不是
列表
公共API的一部分。原因见有效Java第二版第40项,我在此引用:

缩短过长的参数列表有三种方法。一种是将方法分解为多个方法,每个方法只需要参数的子集。如果不小心这样做,可能会导致太多的方法,但它也可以通过增加正交性来帮助减少方法计数。例如,考虑<代码> java .UTI.List接口。它不提供在子列表中查找元素的第一个或最后一个索引的方法,这两个方法都需要三个参数。相反,它提供了
子列表
方法,该方法接受两个参数并返回子列表的视图。此方法可以与
indexOf
lastIndexOf
方法结合使用,每个方法都有一个参数,以产生所需的功能。此外,
子列表
方法可以与对
列表
实例进行操作的任何方法相结合,在子列表上执行任意计算。由此产生的API具有非常高的功率重量比

有人可能会争辩说,
removeRange
没有那么多参数,因此可能不是这种处理的候选者,但是考虑到有一种方法可以通过
子列表调用
removeRange
,没有理由用冗余方法将
列表
界面弄得乱七八糟


†文件说明:

此方法由此列表及其子列表上的
clear
操作调用。重写此方法以利用列表实现的内部功能可以显著提高此列表及其子列表上的
clear
操作的性能


另外,请参阅OpenJDK的和的实现。

好的,可以这样做,但为什么?看起来很尴尬。单个元素可以直接从列表中删除,为什么不删除多个元素呢?@Joonas:effectivejava第二版第40项描述了这一点的基本原理。如果你没有这本书,我会把它粘贴到相关的部分。然而,仅仅因为给出了一个理由并不意味着它是有意义的。缩短参数列表的过程阻碍了开发人员理解API中可用操作的能力,这直接违背了列表最初被缩短的原因。这对于java来说非常典型。让我们将其设置为最复杂和最无效的。作为补充说明,您是否注意到当
ArrayList
版本在列表末尾之前的范围内使用时,
removeRange
会不必要地调用
arraycopy
numMoved
为0,因此如果
(如
remove
中所述),则可以将整个阵列复制代码放入单个
;区别在于a)arraycopy是本机调用,会产生开销;b)arraycopy总是检查参数的正确性