- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
RandomAccess
是 List
使用的 Java 标记接口(interface)实现表明他们可以快速随机访问他们的元素。由于它是专门为 List
设计的实现,为什么不在 List
中等级制度?例如,考虑以下需要 RandomAccess
的方法列表作为输入并返回一个随机元素:
public <E, L extends List<E> & RandomAccess> E getRandomElement(L list) {...}
我必须将匿名列表或声明类型为 ArrayList<E>
的列表传递给此方法,一个具体的类,而不是用像 List<E>
这样的接口(interface)声明的列表.但是,如果 RandomAccess
参数化和扩展 List<E>
,那么我的方法可能如下所示:
public <E, L extends RandomAccess<E>> E getRandomElement(L list) {...}
我可以将一个声明类型为 RandomAccess<E>
的列表传递给它,这是一个接口(interface),而不是一个具体的类。 ArrayList<E>
etc 将执行 RandomAccess<E>
, 而不是 List<E>
.
最佳答案
我认为答案可能在 documentation 中RandomAccess
(强调我的)。
Marker interface used by
List
implementations to indicate that they support fast (generally constant time) random access. The primary purpose of this interface is to allow generic algorithms to alter their behavior to provide good performance when applied to either random or sequential access lists.The best algorithms for manipulating random access lists (such as
ArrayList
) can produce quadratic behavior when applied to sequential access lists (such asLinkedList
). Generic list algorithms are encouraged to check whether the given list is aninstanceof
this interface before applying an algorithm that would provide poor performance if it were applied to a sequential access list, and to alter their behavior if necessary to guarantee acceptable performance.
他们似乎并不打算为集合类层次结构增加额外的复杂性,而只是为算法提供优化机会。
这对我来说确实有些道理。算法的用户通常不需要关心实现细节。在实现 RandomAccess
的 List
上工作的每个算法也将在不这样做的 List
上工作。唯一的区别是性能。
考虑以下情况:
List
,没有办法重写算法以提高效率。 (或者还没有人愿意这样做。)在这种情况下,有一个缓慢的算法可能仍然比根本没有更好。如果用户经常需要该算法,则应切换到不同的 List
实现。List
产生最佳性能。在这里,用户通常更愿意简单地放入 List
并让算法决定使用哪个版本。如果使用重载决策而不是运行时类型自省(introspection),则在处理抽象 List
类型时,用户可能会意外错过优化版本。让调用者每次都检查 List
是否是 instanceof
RandomAccess
比在算法本身中执行一次要多。最后,如果一个算法后来被改进以支持两个版本,我们不需要去更改客户端代码。因此,我认为他们这样做是为了积极地防止您希望使用的界面。当然,这种选择可能会对合法用途产生负面影响,但这似乎是一种合理的权衡。
关于java - 为什么 RandomAccess 不在列表层次结构中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27409287/
我在研究 java 中的集合时遇到了一个问题,即像 ArrayList 这样的一些类也实现了 RandomAccess 而有些类没有。我想知道为什么要实现这个接口(interface),它有什么好处?
我有一个对 List 进行操作的方法,可以删除某些重复项。该算法仅对实现 RandomAccess 的列表有效.为了防止误用和令人失望的性能,我想知道如何强制执行 RandomAccess 限制。不幸
RandomAccess是 List 使用的 Java 标记接口(interface)实现表明他们可以快速随机访问他们的元素。由于它是专门为 List 设计的实现,为什么不在 List 中等级制度?例
我正在阅读 Collections.shuffle(List) javadoc然后看了一下 RandomAccess javadoc : Marker interface used by List i
ArrayList 实现 RandomAccess 接口(interface)。 RandomAccess 接口(interface)没有方法。当我检查 LinkedList 它没有实现 Random
嗯,我们知道 RandomAccess是一个标记接口(interface),文档说: Marker interface used by List implementations to indicate
有一个特殊的界面,它是documented as such (仅摘录): Marker interface used by List implementations to indicate that
我是一名优秀的程序员,十分优秀!