Java 为什么使用数组实现BlockingQueue?

Java 为什么使用数组实现BlockingQueue?,java,java.util.concurrent,Java,Java.util.concurrent,为什么我认为ArrayBlockingQueue实现没有意义- 队列总是在末尾添加,从前面删除。这意味着链表将是实现它的最有效的数据结构。 队列项永远不会使用索引进行访问,因此无法达到建立索引数据结构的目的 阵列总是预先分配的,并且难以增加/减少结构的大小 数组需要连续的内存分配,这不是队列的使用情况,它可能会触发GC的压缩周期,从而将堆分解为碎片 移除数组的第一个元素意味着对其余索引重新排序,这是队列最常见的使用情况。为什么要承担这个费用? 有人不这么认为吗?是的,美国 这是一个经典的有界缓冲

为什么我认为ArrayBlockingQueue实现没有意义-

队列总是在末尾添加,从前面删除。这意味着链表将是实现它的最有效的数据结构。 队列项永远不会使用索引进行访问,因此无法达到建立索引数据结构的目的 阵列总是预先分配的,并且难以增加/减少结构的大小 数组需要连续的内存分配,这不是队列的使用情况,它可能会触发GC的压缩周期,从而将堆分解为碎片 移除数组的第一个元素意味着对其余索引重新排序,这是队列最常见的使用情况。为什么要承担这个费用? 有人不这么认为吗?

是的,美国

这是一个经典的有界缓冲区,其中包含一个固定大小的数组 生产商插入的元素和消费者提取的元素。一旦 创建时,无法更改容量


您只需要一个指向头部和尾部的索引。

如果您实际查看实现,您会发现ArrayBlockingQueue使用数组作为环形缓冲区。这意味着,虽然它对其操作的影响很小,需要进行简单的整数计算,但永远不需要重新分配或重新排序任何内容。

您需要仔细查看实现。这是一个环形缓冲器。不需要洗牌。这就解释了索引部分。您如何看待数据结构的选择。使用LinkedList不是更有效吗?@Bhushan好的,因为索引,第1点和第2点被消除了。第3点已消除,因为ArrayBlockingQueue的大小是固定的。对于4,这在实践中可能很少发生。此外,LinkedList实现需要更多的对象来保存节点,需要更多的变量来引用下一个和上一个对象。对于第5点,我们有头部和尾部指数,因此没有重新排序。