作为开发人员,他们所关心的每个人都必须面对需要可调整大小的集合的需求,您可以在其中添加,删除,检索(FIFO)。
在每个应用程序中,我都看到使用List(ArrayList)来满足这个要求,但我的问题是为什么开发人员不去寻找Queue(可能是ArrayDeque)。按照我的意见 目前的理解我发现ArrayList(List)和ArrayDeque(Queue)同样适用于我所述的要求。但在我的职业生涯中,我仍然没有发现排队 ,总是只找到List。
所以我的问题是为什么Queue不比List更受欢迎。我确信必定有某种原因但不知何故我错过了 理解?
更新: - 这是我的明确要求
1)添加发生在结束时应该很快。可能是O(1)
2)迭代应该很快
3)查找和删除任何特定元素应该更快。
按照上述要求我认为Arralist对ArrayDeque有意义。这是我的观点理由
1)Arraylist和ArrayDeque都是O(1)。正确?
2)两者的迭代性能都是相同的 基于索引。对于ArrayDeque索引将基于时间戳,而对于arraylist用户可以明确提及索引。正确?
3)两者都是O(1),因为查找将基于om index
发生
答案 0 :(得分:1)
如果我更改实现,我更喜欢使用任何引用将为我提供最简单的迁移所需的最小功能集。
如果我只需要添加和删除,我就可以
Collection<T> myCol = new // pick any implementation
如果我需要按FIFO顺序获取它们,我将不会使用List
,因为List
接口没有弹出最旧的接口的方法。它有一个弹出索引0的方法,但这不一样。 如果我需要FIFO排序,我必须让自己使用队列参考。
Queue<T> myQueue = new // pick any implementation
大多数Queue和Deque实现都是列表本身,因此它可能会让人感到困惑。但你不想这样做:
ArrayDeque<T> myQueue = new ArrayDeque<T>(); // yuck! don't use a concrete reference!
相反,请使用具有完成工作所需的最少功能的引用。在这种情况下,这意味着使用接口而不是ArrayDeque
类的实现特定方法。
答案 1 :(得分:1)
如果您只是要访问集合的末尾,那么ArrayList和ArrayDeque将基本上具有相同的功能。如果你的目标是将集合的使用限制为FIFO,那么我会说你最好只使用一个队列,因为deque将允许任何一端的扩展和收缩(而不是FIFO)。
另一方面,如果您想要使用ArrayDeque以获得比ArrayList更好的性能,我认为它们是等效的。两者都需要在需要更多空间时调整大小,并且任何索引处的访问仍然是不变的(尽管您将其限制为FIFO)。如果性能是一个问题,你可以通过使用“循环队列”来提高性能,其中队列可以在第N个索引处回绕并在索引零处再次启动(防止您需要经常调整大小,因为在尺寸仍然小于容量。)
阵列实现的另一个好处是更好的缓存未命中/命中,这是一个很好的振作。
答案 2 :(得分:0)
除了这里提到的内容之外,我个人认为它也可能是语言障碍的一个例子。有些人可能会发现poll,peek这个词有点令人费解,所以他们对Queue视而不见,并使用标准List自己实现队列。