Java 队列的两种常见实现之间有什么区别?

Java 队列的两种常见实现之间有什么区别?,java,queue,collections,Java,Queue,Collections,在Java中,队列的一种实现是“循环数组”,另一种实现是“链表”。它们的区别是什么?通常情况下,循环数组实现在重用内存方面稍好一些,但如果队列中添加了太多的项目,则可能会增加内存,如果正常存储和最大存储容量在实践中相差太大,则可能会占用太多内存 链表更灵活,但通常涉及更多的垃圾收集 实际上,如果您发现您的代码瓶颈取决于此选择,我想我会感到惊讶-使用您觉得最直观的方法。通常,循环数组实现在重用内存方面稍好一些,但是,如果向队列中添加了太多的项,则可能会导致内存增加,如果正常存储和最大存储容量在实践

在Java中,队列的一种实现是“循环数组”,另一种实现是“链表”。它们的区别是什么?

通常情况下,循环数组实现在重用内存方面稍好一些,但如果队列中添加了太多的项目,则可能会增加内存,如果正常存储和最大存储容量在实践中相差太大,则可能会占用太多内存

链表更灵活,但通常涉及更多的垃圾收集


实际上,如果您发现您的代码瓶颈取决于此选择,我想我会感到惊讶-使用您觉得最直观的方法。

通常,循环数组实现在重用内存方面稍好一些,但是,如果向队列中添加了太多的项,则可能会导致内存增加,如果正常存储和最大存储容量在实践中相差太大,则可能会占用太多内存

链表更灵活,但通常涉及更多的垃圾收集


实际上,如果您发现您的代码瓶颈取决于这个选择,我想我会感到惊讶-使用您觉得最直观的选项。

就它们的使用方式而言,几乎没有任何区别,除非您达到队列的大小限制(稍后我将解释…)

至于其他考虑:

  • 链表方法是有利的,因为您无需额外努力即可动态调整队列大小-这是链表的基础。当然,这可以通过重新分配阵列来复制,但这不是最简单的方法

  • 此外,在链表中,没有未使用的内存:在循环数组方法中,如果队列的大小小于数组的最大容量,则会有“空插槽”。但是,这并不意味着链表的内存效率更高,因为:

  • 圆形阵列方法的优点是没有开销。链表中的每个节点都需要存储对下一个节点的引用——如果列表变大,这就加起来了。另一方面,循环数组只是通过索引访问的内存块,因此没有开销


每种方法都有赞成和反对的,但实际上,这取决于它所使用的具体情况。。。除非你一直在使用队列,否则可能不会有多大区别。

就它们的使用方式而言,几乎没有任何区别,除非你达到了队列的大小限制(稍后我会解释…)

至于其他考虑:

  • 链表方法是有利的,因为您无需额外努力即可动态调整队列大小-这是链表的基础。当然,这可以通过重新分配阵列来复制,但这不是最简单的方法

  • 此外,在链表中,没有未使用的内存:在循环数组方法中,如果队列的大小小于数组的最大容量,则会有“空插槽”。但是,这并不意味着链表的内存效率更高,因为:

  • 圆形阵列方法的优点是没有开销。链表中的每个节点都需要存储对下一个节点的引用——如果列表变大,这就加起来了。另一方面,循环数组只是通过索引访问的内存块,因此没有开销


每种方法都有赞成和反对的,但实际上,这取决于它所使用的具体情况。。。除非你一直在使用队列,否则它可能不会有太大的区别。

与ArrayList和LinkedList的区别大致相同

  • 对于阵列,您需要很好地估计队列的大小,因为您需要为其分配存储。但这样做之后,当填充量接近容量时,它会更加紧凑。“空闲点”仍然会占用数组中的空间,这在LinkedList中是不存在的

  • 对于链表,从中间删除和添加元素更容易(尽管队列根本不需要这样做)

  • 数组是随机访问的,这意味着您可以快速到达位置x处的元素。不过,这个特性在队列中也没有用


与ArrayList和LinkedList的区别大致相同

  • 对于阵列,您需要很好地估计队列的大小,因为您需要为其分配存储。但这样做之后,当填充量接近容量时,它会更加紧凑。“空闲点”仍然会占用数组中的空间,这在LinkedList中是不存在的

  • 对于链表,从中间删除和添加元素更容易(尽管队列根本不需要这样做)

  • 数组是随机访问的,这意味着您可以快速到达位置x处的元素。不过,这个特性在队列中也没有用


实现为链表的队列没有固定的大小,而实现为循环数组(也称为循环数组)的队列通常有固定的大小(尽管可以使队列调整大小,就像ArrayList调整大小一样)

链表实现每个元素使用更多内存,但数组实现需要更多连续内存。这两个问题实际上只是一个重要的问题,因为元素的数量变得相当大


向循环数组实现中添加/删除元素非常便宜,因为它只涉及调整计数器和设置引用,而链表实现在添加时必须分配元素,并且在删除时会产生GC开销。

作为链表实现的队列没有固定的大小,其中一个实现为c