只是想知道为什么他们创建了一个LinkedBlockingDeque
,而同一个非并发副本是ArrayDeque
,它是一个可调整大小的数组。
LinkedBlockingQueue
使用一组节点,例如LinkedList
(即使没有实现List
)。
我知道可以使用ArrayBlockingQueue
,但如果想要使用ArrayBlockingDeque
会怎样?
为什么没有这样的选择?
提前致谢。
答案 0 :(得分:2)
这可能不是一个正确的问题w.r.t stackoverflow。 但我想谈谈这些实现。
- >第一件事我们需要回答为什么我们为某个接口提供不同的实现。 假设我们有一个接口A,有两个实现,比方说B和C. 现在假设这些实现通过其实现提供相同的功能。 但是B的表现要比C好。 然后我们应该删除实现除了两个原因
1. Backward Compatibility - marking as deprecated.
2. There is a specific scenario where we cannot use B implementation.
例如:
HashMap和LinkedHashMap - > 如果我需要订购Keys,我将使用LinkedHashMap,否则我将使用HashMap(以获得一点性能提升)。
ArrayBlockingQueue与LinkedBlockingQueue 如果我需要Bounded Queue,我将使用ArrayBlockingQueue,否则我将使用LinkedBlockingQueue。
现在你的问题为什么在LinkedBlockingDeque存在时没有ArrayBlockingDeque 。
首先让我们看看为什么ArrayDeque存在。
来自ArrayDeque的Java文档。
用作队列时。
另请注意,ArrayDeque没有容量限制。 它还有两个用于head和tail的指针,用于LinkedList实现。
因此,如果存在ArrayBlockingDeque 。
1. There would have been no Capacity Restriction, which we normally
get from ArrayBlockingQueue.
2. There would have guards to access to tail and head pointers
same as in LinkedBlockingDeque and therefore no significant performance
gain over LinkedBlockingDeque.
因此得出结论,没有ArrayBlockingDeque实现,因为没有任何东西 额外的这个实现可以通过LinkedBlockingDeque提供。如果你能证明有 那么是的,实现需要在那里:)