Dart中的DoubleLinkedQueue和ListQueue有什么区别?

Ste*_*ose 4 queue iterator linked-list list dart

达特核心API已经实现了两个类Queue<E>接口,DoubleLinkedQueue<E>ListQueue<E>

这两个类的文档几乎相同,唯一明确提到的区别是ListQueue<E>文档中的以下注释:

removeAllremoveWhere这样的操作效率很低。如果需要这些,请改用a DoubleLinkedQueue

它们在实现方面的实际区别是什么?何时应使用哪种实现?

Flo*_*sch 7

DoubleLinkedQueue基本上是一个队列上双链表的基础上实现的。这意味着删除它在任意位置的元素很快,因为它只需要调整指针即可。

ListQueue上一个列表的基础上实现。第一个和最后一个是列表的索引。通常,这是更有效的实现,因为它比双链表具有更少的内存开销。

您可以在此处看到两种实现

大多数情况下,您想使用ListQueue。因此,Queue接口默认为ListQueue(即new Queue()返回ListQueue)。

DoubleLinkedQueue如果您需要有选择地删除队列中的元素,则该实现最为有用。这是一种相对罕见的情况,该类位于dart库中的主要原因是它DoubleLinkedQueue存在于之前ListQueue。由于我们已经有了,所以DoubleLinkedQueue我们保留了它。如果我们从ListQueue开始,我们可能不会添加DoubleLinkedQueue