在有效Java中指出

List实现的最终用户对removeRange方法不感兴趣。 提供它的唯一目的是使子类可以轻松地在子列表上提供快速清除的方法。 在没有removeRange方法的情况下,当在子列表上调用clear方法或从头开始重写整个subList机制时,子类将不得不具有二次性能。这不是一件容易的事!

请看一下这个链接 最后一段。 它说,在没有 removeRange方法的情况下 ,子类将不得不考虑二次性能

请解释为什么作者这么说。

#1楼 票数:1

在没有removeRange方法的情况下,当在子列表上调用clear方法时,子类将不得不具有二次性能。

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

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

#2楼 票数:1 已采纳

AbstractList已经提供了subList(int from, int to)的默认实现。 此默认子列表的clear()方法仅在其父列表上调用removeRange(...)

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

removeRange(...)实施AbstractList默认使用的迭代器。 因此,子类应重写它以提供更高性能的实现(如果有)。

优点:为了优化性能,子类必须仅实现removeRange ,并且它们可以保留subList(...)的默认实现。

  ask by user961690 translate from so

未解决问题?本站智能推荐:

3回复

有效的Java项目17:如何覆盖removeRange()提高性能?

在Joshua Bloch撰写的Effective Java一书中,讨论了一个类如何提供“明智选择的受保护方法”作为其内部工作的钩子。 然后,作者引用了AbstractList.removeRange()的文档: 此方法由此列表及其子列表上的clear操作调用。 重写此方法以利用列表
4回复

EffectiveJava-第25项-泛型类转换异常混合列表和数组

我正在阅读Joshua Bloch撰写的Effective Java第2版,第25项(第122页)。 当您进一步阅读本章时,您会发现作者编写以下代码: 然后作者声明编译器不会编译它,因为你需要在赋值E[] snapshot = list.toArray();的行中添加一个显式的E[] sn
1回复

在有效的Java第二项72中实现CountDownLatch的更好方法是什么?

有效的Java项目72显示了CountDownLatch实现的错误示例。 但是它并没有显示实现它的正确方法。 我是否必须使用wait()和notify()而不是while循环? 谁能给我推荐这个项目的一个好例子? 下面是错误的代码示例:
1回复

在构造函数方法引用中,使用通用类型参数与不使用通用类型参数之间的区别是什么?

我正在阅读有效的Java 3,并在项目43:“首选对lambdas的方法引用”中注意到此代码: 注意类型参数。 我一直都做: 我使用Intellij,但从未收到有关此更改或更改它的任何建议的警告。 实际上,当我让IDE将上述方法引用更改为lambda时,它将其转换为 包括类型参数
1回复

实用程序类如何用于对最终类上的方法进行分组,而不是扩展类?

约书亚·布洛赫(Joshua Bloch)在他的书( 有效Java-第2版 )中提到了项目4 : 仅包含静态字段和静态方法的类(实用程序类)可用于对最终类上的方法进行分组,而不必扩展该类。 谁能解释这句话?
2回复

如何使用静态工厂方法创建抽象类?

我有一个带有两个面板的“标准” JPanel 。 我试图创建一种模板类,然后对其进行扩展并实现其内容。 问题在于,将采用哪种方式实施它。 下面的代码是我试图使其起作用的代码,但是我刚开始阅读有效的Java书,并且我对静态工厂方法不熟悉。 特别是尝试抽象它们。 我要特别遵循的书中的一
2回复

我们在Builder模式中是否需要.build()方法?

我有一个关于“Effective Java”中涵盖的“Builder Pattern”的问题。 我们需要一个.build()方法来正确实现模式吗? 例如,假设我们有以下类: 然后我们如何使用它: 如果我没有静态的内部Builder类,这仍然有效吗? 我猜其中一个优点是它不会创建一个
6回复

如果我覆盖Java中的'equals'方法,为什么需要重写hashcode?

我知道只要在Java中重写equals方法,就需要覆盖hashcode。 那只是一份合同。 我试图理解这背后的逻辑。 我正在阅读Joshua Bloch撰写的 * Effective Java,我遇到了这段代码(第9项,第45页): 这是他在文中提到的,我很难理解。 此时,您可能