为什么ArrayBlockingQueue使用数组来删除内部缓冲区?

时间:2016-11-11 07:43:33

标签: java queue

ArrayBlockingQueue包含一个缓冲区作为数组。它也支持公认效率低下的

public boolean remove(Object o)
  

删除基于圆形阵列的队列中的内部元素是一种方法   本质上是缓慢和破坏性的操作,所以应该进行   仅在特殊情况下,理想情况下仅在队列出现时   已知其他线程无法访问。

为什么设计师在这里使用一个数组而不是LinkedList如果我告诉LinkedLists更快地从数组中间删除元素。这是我的理论:

去除主要是从头部进行,甚至可能是尾部,但很少是中部。因此,设计人员希望处理更常见的用例并使其更快,因此接受不常见的中间缓冲区删除用例的性能损失。

2 个答案:

答案 0 :(得分:0)

一切都在名称中:ArrayBlockingQueue使用数组作为缓冲区,LinkedBlockingQueue使用链接列表。

存在一些实施差异:

ArrayBlockingQueue使用固定大小的数组来构建一个环形缓冲区来存储元素,因此它有一个固定的大小,不能改变(但也有固定的内存开销)。

LinkedBlockingQueue使用链表,因此可以根据需要增长,但必须在添加元素时进行内存分配。

在较不常见的remove(Object)调用中,它们都必须扫描对象(因此具有O(n)时间复杂度)。

答案 1 :(得分:0)

ArrayBlockingQueue使用数组,因为......好吧......它是数组 BlockingQueue,而不是LinkedBlockingQueue。

如果您想要链接列表实现,请使用LinkedBlockingQueue

除此之外,你已经有了答案:人们很少想要从队列中间删除一些东西,所以如果你从未这样做,你可以获得循环阵列实现的其他优点。如果这不适合您的应用程序,请使用不同的BlockingQueue实现。