为什么列表比队列更受欢迎?

时间:2013-12-24 18:13:26

标签: java list arraylist queue arraydeque

作为开发人员,他们所关心的每个人都必须面对需要可调整大小的集合的需求,您可以在其中添加,删除,检索(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

发生

3 个答案:

答案 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自己实现队列。