Dart ListQueue
last modified June 8, 2025
In Dart, ListQueue is a high-performance, list-based implementation
of the Queue interface. It is designed for efficient insertion and
removal at both ends, providing O(1) time complexity for these operations. This
makes it ideal for scenarios where frequent modifications at the front and back
of the queue are required.
Unlike a standard List, which requires shifting elements when
modifying the front, ListQueue uses a cyclic buffer internally.
This ensures that adding and removing elements remains fast, even as the queue
grows dynamically.
Key features of ListQueue:
- Supports constant-time insertion and removal at both ends.
- Maintains FIFO (First-In, First-Out) order for predictable processing.
- Uses a cyclic buffer, avoiding costly element shifting.
- Provides index-based access similar to lists.
- Offers methods for adding, removing, and iterating over elements.
By leveraging ListQueue, developers can efficiently manage
collections where fast modifications at both ends are necessary, making it a
powerful alternative to traditional lists for queue-based operations.
Creating a ListQueue
We can create a ListQueue using its constructor or from an existing
iterable.
import 'dart:collection';
void main() {
var queue = ListQueue<String>();
queue.add('apple');
queue.add('banana');
queue.add('orange');
print(queue);
}
This creates an empty ListQueue and adds three elements. The
generic type parameter specifies the element type as String.
$ dart main.dart
{apple, banana, orange}
Adding Elements
ListQueue provides multiple methods for adding elements at
different positions.
import 'dart:collection';
void main() {
var queue = ListQueue.of([1, 2, 3]);
queue.add(4);
queue.addFirst(0);
queue.addAll([5, 6]);
print(queue);
}
The of method creates a queue from an iterable. We demonstrate
adding elements to both ends of the queue. addFirst
is particularly useful for queue operations.
$ dart main.dart
{0, 1, 2, 3, 4, 5, 6}
Removing Elements
ListQueue provides several ways to remove elements from the
collection.
import 'dart:collection';
void main() {
var queue = ListQueue.of(['a', 'b', 'c', 'd', 'e']);
var first = queue.removeFirst();
var last = queue.removeLast();
queue.remove('c');
print('Removed: $first, $last');
print('Remaining: $queue');
}
This shows FIFO (removeFirst) and LIFO (removeLast)
operations. The remove method deletes the first occurrence of the
specified value.
$ dart main.dart
Removed: a, e
Remaining: {b, d}
Accessing Elements
ListQueue supports both queue-style access and index-based element
retrieval.
import 'dart:collection';
void main() {
var queue = ListQueue.of([10, 20, 30, 40, 50]);
print('First: ${queue.first}');
print('Last: ${queue.last}');
print('Element at 2: ${queue.elementAt(2)}');
print('All elements:');
for (var item in queue) {
print(item);
}
}
ListQueue maintains list-like characteristics while providing queue
operations. We can access elements by position or iterate through them.
$ dart main.dart First: 10 Last: 50 Element at 2: 30 All elements: 10 20 30 40 50
Queue Operations
ListQueue implements standard queue operations with efficient
performance.
import 'dart:collection';
void main() {
var queue = ListQueue<int>();
// Enqueue elements
queue.addLast(1);
queue.addLast(2);
queue.addLast(3);
// Dequeue elements
while (queue.isNotEmpty) {
print('Processing: ${queue.removeFirst()}');
}
print('Queue empty: ${queue.isEmpty}');
}
This demonstrates classic FIFO queue behavior. Elements are added at the end and
removed from the front. The isNotEmpty check is safer than checking
length.
$ dart main.dart Processing: 1 Processing: 2 Processing: 3 Queue empty: true
Best Practices
- Queue vs List: Use
ListQueuewhen you need both queue operations and index access. - Capacity: Consider initial capacity for large queues to reduce reallocations.
- Bulk Operations: Use
addAllfor adding multiple elements efficiently. - Type Safety: Always specify generic type parameters for type safety.
Source
This tutorial covered Dart's ListQueue with practical examples
demonstrating its key features and usage patterns for efficient queue
operations.
Author
List all Dart tutorials.