为啥 ArrayList 没有实现 Queue?

Posted

技术标签:

【中文标题】为啥 ArrayList 没有实现 Queue?【英文标题】:Why ArrayList doesn't implements Queue?为什么 ArrayList 没有实现 Queue? 【发布时间】:2017-05-30 15:27:55 【问题描述】:

也许这很愚蠢,但我必须知道答案。我在查看它的源代码时摸不着头脑,看不出作者在LinkedList 中实现Queue 的任何原因,但决定不对ArrayList 做同样的事情,而是创建了单独的类ArrayDeque

【问题讨论】:

【参考方案1】:

interface Queue 要求 add 将项目添加到 Queue 的末尾,removeQueue 的开头获取元素。

(伪代码)

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]

现在;使用 ArrayListremove 操作将是 O(n) - 我想 API 设计人员认为这种性能是不可接受的。

removeO(n) 因为它需要重新索引整个列表 - B 现在是 0C 现在是 1LinkedList 没有这个问题,因为它使用了链表数据结构;它只是删除头节点并将该节点的子节点设置为新的头节点。

ArrayDeque 是在 O(1) 中支持此功能的不同设计 - 因此它不是 List

【讨论】:

【参考方案2】:

很可能是因为它作为Queue 的性能不是很好,因为添加到(好吧,在Queue 的情况下删除)开头是O(N) 操作而不是O(1)。另一方面,ArrayDeque 是一种不同的设计,因为它不是 List,因此不需要提供随机访问。

【讨论】:

ArrayList 早于Queue 多年和几个版本。不能仅仅因为新接口的存在而简单地扩展一种类型的契约。尤其是当这样做的价值值得怀疑时。 LinkedList,OTOH,值得付出努力。 @LewBloch 这并不完全正确。有许多旧类已被修改以实现有意义的新接口。使用ArrayList 作为队列是可能的,但它不是很聪明。 是的,有,就像我提到的LinkedList @LewBloch 我不清楚你为什么决定用这种自相矛盾的说法发表评论。没有任何努力。让LinkedList 实现Queue 非常简单。 当然,我并没有说LinkedList 需要付出很多努力。这是我最初的观点,它确实不需要需要太多的努力。这有什么矛盾的?

以上是关于为啥 ArrayList 没有实现 Queue?的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList和LinkedList和Vactor的区别

ArrayList和LinkedList和Vactor的区别

为啥 ArrayList 没有标记为 [过时]?

.NET中的Queue和Stack

为啥我没有从 ArrayList 获取 ListView 数据?

将矩形添加到ArrayList