ArrayBlockingQueue包含一个缓冲区作为数组。它也支持公认效率低下的
public boolean remove(Object o)
删除基于圆形阵列的队列中的内部元素是一种方法 本质上是缓慢和破坏性的操作,所以应该进行 仅在特殊情况下,理想情况下仅在队列出现时 已知其他线程无法访问。
为什么设计师在这里使用一个数组而不是LinkedList如果我告诉LinkedLists更快地从数组中间删除元素。这是我的理论:
去除主要是从头部进行,甚至可能是尾部,但很少是中部。因此,设计人员希望处理更常见的用例并使其更快,因此接受不常见的中间缓冲区删除用例的性能损失。
答案 0 :(得分:0)
一切都在名称中:ArrayBlockingQueue
使用数组作为缓冲区,LinkedBlockingQueue
使用链接列表。
存在一些实施差异:
ArrayBlockingQueue
使用固定大小的数组来构建一个环形缓冲区来存储元素,因此它有一个固定的大小,不能改变(但也有固定的内存开销)。
LinkedBlockingQueue
使用链表,因此可以根据需要增长,但必须在添加元素时进行内存分配。
在较不常见的remove(Object)
调用中,它们都必须扫描对象(因此具有O(n)时间复杂度)。
答案 1 :(得分:0)
ArrayBlockingQueue使用数组,因为......好吧......它是数组 BlockingQueue,而不是LinkedBlockingQueue。
如果您想要链接列表实现,请使用LinkedBlockingQueue。
除此之外,你已经有了答案:人们很少想要从队列中间删除一些东西,所以如果你从未这样做,你可以获得循环阵列实现的其他优点。如果这不适合您的应用程序,请使用不同的BlockingQueue实现。