gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:03:11 25 4
gpt4 key购买 nike

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

public boolean remove(Object o)

Removal of interior elements in circular array based queues is an intrinsically slow and disruptive operation, so should be undertaken only in exceptional circumstances, ideally only when the queue is known not to be accessible by other threads.

如果我被告知 LinkedList 可以更快地从数组中间删除元素,那么为什么设计人员在这里使用数组而不是 LinkedList。这是我的理论:

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

最佳答案

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

存在一些实现差异:

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

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

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

关于java - 为什么 ArrayBlockingQueue 使用数组来删除内部缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40543328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com