Java AbstractList类的removeRange方法在子类中有什么用途

Java AbstractList类的removeRange方法在子类中有什么用途,java,list,effective-java,Java,List,Effective Java,在有效的Java中,声明 列表的最终用户对removeRange方法不感兴趣 实施提供它只是为了使子类更容易 提供子列表上的快速清除方法。在没有 如果使用Remounge方法,子类将不得不使用二次函数 在子列表或重写上调用clear方法时的性能 从头开始的整个子列表机制不是一件容易的任务 请看看这个。最后一段。它说在缺少removange方法的情况下,子类将不得不处理二次性能 请解释作者为什么这样说 在缺少removeRange方法的情况下,当对子列表调用clear方法时,子类将不得不处理二次性

在有效的Java中,声明

列表的最终用户对removeRange方法不感兴趣 实施提供它只是为了使子类更容易 提供子列表上的快速清除方法。在没有 如果使用Remounge方法,子类将不得不使用二次函数 在子列表或重写上调用clear方法时的性能 从头开始的整个子列表机制不是一件容易的任务

请看看这个。最后一段。它说在缺少removange方法的情况下,子类将不得不处理二次性能

请解释作者为什么这样说

在缺少
removeRange
方法的情况下,当对子列表调用clear方法时,子类将不得不处理二次性能

作者假设实现必须为范围的每个元素调用
remove
。在一些实现中,例如
ArrayList
s,
remove
必须在删除元素后复制所有内容,这具有O(n)复杂性。假设范围大小为
r
,则循环实现的总体复杂性为O(n*r),这是二次的


特定于
ArrayList
removeRange
的实现具有O(n)复杂性,因为您可以在单个循环中将复制到它的新位置。

抽象列表
已经提供了
子列表(int-from,int-to)的默认实现。
。此默认子列表的
clear()
方法只是在其父列表上调用
removeRange(…)

如果没有
removeRange(…)
,子列表将不得不使用迭代器,反复调用
next()
remove()
。但是通过
Iterator.remove()
删除元素可能具有线性性能,例如
ArrayList
必须在每次删除元素时左移其内部数组中的所有后续元素。重复调用线性方法会导致二次性能

注意:
AbstractList
中的
removeRange(…)
实现默认使用迭代器。所以子类应该覆盖它以提供更高性能的实现(如果可用)


优点:为了优化性能,子类必须只实现
removeRange
,并且它们可以保持
子列表(…)

的默认实现。如果没有
removeRange
方法,实现类必须处理一个受O(N^2)约束的解决方案。@EvanKnowles,我理解二次性能的含义。我问为什么是二次技术,你开始在你的标题中询问这种方法的使用,而不是二次性能,所以它可能会令人困惑。@Gnoupi是的,先生,请原谅我。对不起,先生,我不能接受你的回答。但请相信我,你的回答和我接受的答案一样精彩。我将检查您回答的问题,并立即奖励您+25或更多。谢谢