为啥 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
的末尾,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
。
【讨论】:
【参考方案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的区别