Java 队列的两种常见实现之间有什么区别?
在Java中,队列的一种实现是“循环数组”,另一种实现是“链表”。它们的区别是什么?通常情况下,循环数组实现在重用内存方面稍好一些,但如果队列中添加了太多的项目,则可能会增加内存,如果正常存储和最大存储容量在实践中相差太大,则可能会占用太多内存 链表更灵活,但通常涉及更多的垃圾收集Java 队列的两种常见实现之间有什么区别?,java,queue,collections,Java,Queue,Collections,在Java中,队列的一种实现是“循环数组”,另一种实现是“链表”。它们的区别是什么?通常情况下,循环数组实现在重用内存方面稍好一些,但如果队列中添加了太多的项目,则可能会增加内存,如果正常存储和最大存储容量在实践中相差太大,则可能会占用太多内存 链表更灵活,但通常涉及更多的垃圾收集 实际上,如果您发现您的代码瓶颈取决于此选择,我想我会感到惊讶-使用您觉得最直观的方法。通常,循环数组实现在重用内存方面稍好一些,但是,如果向队列中添加了太多的项,则可能会导致内存增加,如果正常存储和最大存储容量在实践
实际上,如果您发现您的代码瓶颈取决于此选择,我想我会感到惊讶-使用您觉得最直观的方法。通常,循环数组实现在重用内存方面稍好一些,但是,如果向队列中添加了太多的项,则可能会导致内存增加,如果正常存储和最大存储容量在实践中相差太大,则可能会占用太多内存 链表更灵活,但通常涉及更多的垃圾收集
实际上,如果您发现您的代码瓶颈取决于这个选择,我想我会感到惊讶-使用您觉得最直观的选项。就它们的使用方式而言,几乎没有任何区别,除非您达到队列的大小限制(稍后我将解释…) 至于其他考虑:
- 链表方法是有利的,因为您无需额外努力即可动态调整队列大小-这是链表的基础。当然,这可以通过重新分配阵列来复制,但这不是最简单的方法
- 此外,在链表中,没有未使用的内存:在循环数组方法中,如果队列的大小小于数组的最大容量,则会有“空插槽”。但是,这并不意味着链表的内存效率更高,因为:
- 圆形阵列方法的优点是没有开销。链表中的每个节点都需要存储对下一个节点的引用——如果列表变大,这就加起来了。另一方面,循环数组只是通过索引访问的内存块,因此没有开销
每种方法都有赞成和反对的,但实际上,这取决于它所使用的具体情况。。。除非你一直在使用队列,否则可能不会有多大区别。就它们的使用方式而言,几乎没有任何区别,除非你达到了队列的大小限制(稍后我会解释…) 至于其他考虑:
- 链表方法是有利的,因为您无需额外努力即可动态调整队列大小-这是链表的基础。当然,这可以通过重新分配阵列来复制,但这不是最简单的方法
- 此外,在链表中,没有未使用的内存:在循环数组方法中,如果队列的大小小于数组的最大容量,则会有“空插槽”。但是,这并不意味着链表的内存效率更高,因为:
- 圆形阵列方法的优点是没有开销。链表中的每个节点都需要存储对下一个节点的引用——如果列表变大,这就加起来了。另一方面,循环数组只是通过索引访问的内存块,因此没有开销
每种方法都有赞成和反对的,但实际上,这取决于它所使用的具体情况。。。除非你一直在使用队列,否则它可能不会有太大的区别。与ArrayList和LinkedList的区别大致相同
- 对于阵列,您需要很好地估计队列的大小,因为您需要为其分配存储。但这样做之后,当填充量接近容量时,它会更加紧凑。“空闲点”仍然会占用数组中的空间,这在LinkedList中是不存在的
- 对于链表,从中间删除和添加元素更容易(尽管队列根本不需要这样做)
- 数组是随机访问的,这意味着您可以快速到达位置x处的元素。不过,这个特性在队列中也没有用
- 对于阵列,您需要很好地估计队列的大小,因为您需要为其分配存储。但这样做之后,当填充量接近容量时,它会更加紧凑。“空闲点”仍然会占用数组中的空间,这在LinkedList中是不存在的
- 对于链表,从中间删除和添加元素更容易(尽管队列根本不需要这样做)
- 数组是随机访问的,这意味着您可以快速到达位置x处的元素。不过,这个特性在队列中也没有用
向循环数组实现中添加/删除元素非常便宜,因为它只涉及调整计数器和设置引用,而链表实现在添加时必须分配元素,并且在删除时会产生GC开销。作为链表实现的队列没有固定的大小,其中一个实现为c