【发布时间】:2017-05-30 15:27:55
【问题描述】:
也许这很愚蠢,但我必须知道答案。我在查看它的源代码时摸不着头脑,看不出作者在LinkedList 中实现Queue 的任何原因,但决定不对ArrayList 做同样的事情,而是创建了单独的类ArrayDeque。
【问题讨论】:
标签: java oop arraylist collections
也许这很愚蠢,但我必须知道答案。我在查看它的源代码时摸不着头脑,看不出作者在LinkedList 中实现Queue 的任何原因,但决定不对ArrayList 做同样的事情,而是创建了单独的类ArrayDeque。
【问题讨论】:
标签: java oop arraylist collections
interface Queue 要求 add 将项目添加到 Queue 的末尾,remove 从 Queue 的开头获取元素。
(伪代码)
Queue<String> q = ...
q.add("A")
q.add("B")
q.add("C")
//q is now [A,B,C]
String a = q.remove()
// a is A and q is [B, C]
现在;使用 ArrayList,remove 操作将是 O(n) - 我想 API 设计人员认为这种性能是不可接受的。
remove 是 O(n) 因为它需要重新索引整个列表 - B 现在是 0 和 C 现在是 1。 LinkedList 没有这个问题,因为它使用了链表数据结构;它只是删除头节点并将该节点的子节点设置为新的头节点。
ArrayDeque 是在 O(1) 中支持此功能的不同设计 - 因此它不是 List。
【讨论】:
很可能是因为它作为Queue 的性能不是很好,因为添加到(好吧,在Queue 的情况下删除)开头是O(N) 操作而不是O(1)。另一方面,ArrayDeque 是一种不同的设计,因为它不是 List,因此不需要提供随机访问。
【讨论】:
ArrayList 早于Queue 多年和几个版本。不能仅仅因为新接口的存在而简单地扩展一种类型的契约。尤其是当这样做的价值值得怀疑时。 LinkedList,OTOH,值得付出努力。
ArrayList 作为队列是可能的,但它不是很聪明。
LinkedList。
LinkedList 实现Queue 非常简单。
LinkedList 需要付出很多努力。这是我最初的观点,它确实不需要需要太多的努力。这有什么矛盾的?