Dart 队列
最后修改于 2025 年 6 月 8 日
在 Dart 中,Queue 是一个动态集合,它实现了双端队列(deque),允许在两端高效地插入和删除元素。默认情况下,它遵循 FIFO(先进先出)原则,这意味着元素按添加的顺序进行处理。
与提供基于索引访问的标准 List 不同,Queue 针对两端的快速修改进行了优化,无需移动元素。这使其成为任务调度、缓冲和撤销/重做操作等场景的理想选择。
队列的关键特性
- 支持在两端进行常数时间插入和删除。
- 保持 FIFO 顺序以进行可预测的处理。
- 提供用于添加、删除和迭代元素的各种方法。
- 不支持像 List 那样的随机索引访问。
通过利用 Queue,开发人员可以有效地管理需要两端快速修改的集合,使其成为基于队列操作的传统列表的强大替代品。
创建队列
创建 Queue 最简单的方法是使用 dart:collection 库中的 Queue 工厂构造函数。您可以创建一个空队列,或使用其他集合中的元素对其进行初始化。
Queue 类是泛型的,允许您指定它将保存的元素的类型。这确保了类型安全,并允许队列仅存储指定类型的元素。该工厂构造函数创建 ListQueue 的新实例,ListQueue 是 Queue 接口的具体实现。
factory Queue() = ListQueue<E>;
它使用可调整大小的数组来存储元素,提供高效的访问和修改操作。Queue 类实现了 Iterable 接口,允许您使用标准的迭代方法来迭代其元素。它还提供了用于添加、删除和检查元素的各种方法,使其成为管理 Dart 中集合的通用选择。
import 'dart:collection';
void main() {
var queue = Queue<String>();
queue.add('Apple');
queue.add('Banana');
queue.add('Cherry');
print(queue);
}
我们创建一个 String 类型的 Queue 并添加三个元素。add 方法将元素附加到队列的末尾。泛型类型指定了元素的类型。
$ dart main.dart
{Apple, Banana, Cherry}
向队列添加元素
Queue 提供了多种在两端添加元素的方法。
import 'dart:collection';
void main() {
var queue = Queue<int>();
// Add to end
queue.add(1);
queue.addLast(2);
// Add to beginning
queue.addFirst(0);
// Add multiple
queue.addAll([3, 4]);
print(queue);
}
我们演示了各种添加方法。add 和 addLast 在末尾添加,而 addFirst 在开头添加。addAll 一次添加多个元素。
$ dart main.dart
{0, 1, 2, 3, 4}
从队列中移除元素
Queue 提供了高效地从两端移除元素的方法。
import 'dart:collection';
void main() {
var queue = Queue.from([10, 20, 30, 40, 50]);
// Remove from start
var first = queue.removeFirst();
// Remove from end
var last = queue.removeLast();
// Remove specific element
queue.remove(30);
print('Removed: $first, $last');
print('Remaining: $queue');
}
removeFirst 和 removeLast 从两端高效移除。remove 删除第一次出现的某个值。所有这些方法都会就地修改队列。
$ dart main.dart
Removed: 10, 50
Remaining: {20, 40}
队列操作
Queue 提供了用于检查和修改的各种操作。
import 'dart:collection';
void main() {
var queue = Queue.from(['Red', 'Green', 'Blue']);
// Check properties
print('First: ${queue.first}');
print('Last: ${queue.last}');
print('Length: ${queue.length}');
print('Is empty: ${queue.isEmpty}');
// Clear queue
queue.clear();
print('After clear: $queue');
}
我们演示了常见的 Queue 操作。first 和 last 在不移除的情况下查看元素。length 和 isEmpty 检查大小。clear 移除所有元素。
$ dart main.dart
First: Red
Last: Blue
Length: 3
Is empty: false
After clear: {}
迭代队列
可以使用标准的迭代方法来迭代队列。
import 'dart:collection';
void main() {
var queue = Queue.from([1, 2, 3, 4, 5]);
// For-in loop
print('For-in:');
for (var num in queue) {
print(num);
}
// forEach
print('\nforEach:');
queue.forEach(print);
// Iterator
print('\nIterator:');
var it = queue.iterator;
while (it.moveNext()) {
print(it.current);
}
}
我们展示了迭代 Queue 的三种方法。for-in 循环最常见。forEach 提供了一种函数式的方法。Iterator 提供了手动控制。
最佳实践
- FIFO 操作:需要高效 FIFO 操作时使用
Queue。 - 无索引访问:如果需要按索引进行随机访问,请避免使用
Queue。 - 内存效率:对于队列操作,
Queue比List更节省内存。 - 类型安全:始终指定泛型类型以确保类型安全。
来源
本教程通过实际示例涵盖了 Dart 的 Queue,展示了其关键特性和用法模式。
作者
列出 所有 Dart 教程。