Java 为什么列表优先于队列?

Java 为什么列表优先于队列?,java,list,arraylist,queue,arraydeque,Java,List,Arraylist,Queue,Arraydeque,作为一名开发人员,每个人都必须面对这样的需求:您需要可调整大小的集合,您可以在其中添加、删除、检索(FIFO) 在我看到的每个应用程序中,都使用List(ArrayList)来满足这一需求,但我的问题是,为什么开发人员不使用Queue(可能是ArrayDeque)。根据我的 目前的理解是,我发现ArrayList(列表)和ArrayQueue(队列)对于我所述的需求同样适用。但在我的职业生涯中,我从未见过排队 ,始终只查找列表 所以我的问题是,为什么队列比列表更受欢迎。我相信一定有原因,但不知怎

作为一名开发人员,每个人都必须面对这样的需求:您需要可调整大小的集合,您可以在其中添加、删除、检索(FIFO)

在我看到的每个应用程序中,都使用List(ArrayList)来满足这一需求,但我的问题是,为什么开发人员不使用Queue(可能是ArrayDeque)。根据我的 目前的理解是,我发现ArrayList(列表)和ArrayQueue(队列)对于我所述的需求同样适用。但在我的职业生涯中,我从未见过排队 ,始终只查找列表

所以我的问题是,为什么队列比列表更受欢迎。我相信一定有原因,但不知怎么的,我错过了 理解

更新:-以下是我的明确要求

1) 加法发生在末尾,应该很快。可能是O(1)

2) 迭代应该很快

3) 查找和删除任何特定元素的速度都应该更快

按照上述要求,我认为Arralist优于ArrayDesk。以下是我的观点

1) Arraylist和ArrayQue都将是O(1)。对吧?

2) 两者的迭代性能将是相同的 基于索引。对于ArrayQue,索引将基于时间戳,而对于arraylist,用户可以明确提及索引。对吧?

3) 由于将根据om索引进行查找,所以这两个值都将为O(1)


如果我改变了实现,我更喜欢使用任何能为我提供最简单迁移所需的最小功能集的引用

如果我只需要添加和删除,我可以这样做

Collection<T> myCol = new // pick any implementation
大多数Queue和Deque实现都是列表本身,因此可能会造成混淆。但您不想这样做:

ArrayDeque<T> myQueue = new ArrayDeque<T>(); // yuck! don't use a concrete reference!
ArrayDeque myQueue=new ArrayDeque();//讨厌!不要使用具体的参考资料!

相反,使用一个具有完成该工作所需的最少功能的引用。在这种情况下,这意味着使用接口而不是
ArrayQue
类的特定于实现的方法。

如果您只想访问集合的末端,那么ArrayList和ArrayQue基本上具有相同的功能。如果您的目标是将集合的使用限制为FIFO,那么我认为您最好只使用队列,因为deque允许在任意一端(而不是FIFO)进行扩展和收缩

另一方面,如果您想知道如何使用ArrayQue来获得比ArrayList更好的性能,我认为它们是等效的。当它们需要更多的空间时,它们都需要调整大小,并且对任何索引的访问仍然是恒定的(尽管您将限制为FIFO)。如果性能是一个问题,您可以通过使用“循环队列”获得性能提升,其中队列可以在第n个索引处环绕,并在索引为零时重新启动(防止在大小仍然小于容量时由于删除而经常需要调整大小)


阵列实现的另一个好处是更好地缓存未命中/命中,这是一个很好的优势。

除了这里提到的以外,我个人认为这也可能是语言障碍的一种情况。有些人可能会觉得poll、peek、offer这几个词有点令人费解,因此他们对队列熟视无睹,并使用标准列表自己实现队列。

相关(我实际上是在寻找它,因为我想我记得一个重复):corsiKlause Ho-Ho。请看我的最新帖子,并请让我知道你对它的想法。我想如果我需要FIFO检索,我必须使用队列,但如果我想要索引方式的检索,我必须使用列表。对吗?听起来对。如果只需要从结束中移除,考虑<代码>循环ARRAYQueYe>代码>没有默认java实现,但是如果在Internet上搜索它,则有可用的实现。FY:<代码> ARARYLIST//COM>未能满足需求3的测试。如果需要从中间删除,
ArrayList
具有
O(n)
removals.:-{正如你所说的“如果你需要从中间移除,ArrayList有O(n)个移除。”我想你的意思是移除它将是O(1),但是现在移除的元素下面的元素需要向上移动。所以总成本变成O(n)。对吗?
ArrayDeque<T> myQueue = new ArrayDeque<T>(); // yuck! don't use a concrete reference!