Dart LinkedHashMap
last modified April 4, 2025
In Dart, LinkedHashMap is an ordered collection of key-value pairs. It maintains insertion order while providing fast lookup operations.
LinkedHashMap implements the Map interface using a hash table and linked list. This combination preserves order while maintaining O(1) access time for keys.
Creating a LinkedHashMap
LinkedHashMap can be created using its constructor or from another Map.
import 'dart:collection'; void main() { var orderedCapitals = LinkedHashMap<String, String>(); orderedCapitals['USA'] = 'Washington'; orderedCapitals['Japan'] = 'Tokyo'; orderedCapitals['France'] = 'Paris'; print(orderedCapitals); }
We create a LinkedHashMap of country-capital pairs. The entries will be printed in the same order they were inserted, unlike regular HashMap.
$ dart main.dart {USA: Washington, Japan: Tokyo, France: Paris}
LinkedHashMap.from
We can create a LinkedHashMap from an existing Map while preserving order.
import 'dart:collection'; void main() { var unordered = {'z': 1, 'a': 2, 'm': 3}; var ordered = LinkedHashMap.from(unordered); print('Original: $unordered'); print('LinkedHashMap: $ordered'); }
The LinkedHashMap.from constructor creates a new map with the same entries. The insertion order is preserved from the original map's iteration order.
$ dart main.dart Original: {z: 1, a: 2, m: 3} LinkedHashMap: {z: 1, a: 2, m: 3}
Maintaining Insertion Order
LinkedHashMap preserves insertion order even when entries are modified.
import 'dart:collection'; void main() { var tasks = LinkedHashMap<int, String>(); tasks[1] = 'Buy groceries'; tasks[2] = 'Clean house'; tasks[3] = 'Pay bills'; // Modify existing entry tasks[2] = 'Deep clean house'; // Add new entry tasks[4] = 'Walk dog'; print(tasks); }
Modifying an existing value doesn't change its position in the iteration order. New entries are always added to the end of the iteration sequence.
$ dart main.dart {1: Buy groceries, 2: Deep clean house, 3: Pay bills, 4: Walk dog}
Accessing First and Last Elements
LinkedHashMap provides easy access to its first and last entries.
import 'dart:collection'; void main() { var colors = LinkedHashMap<String, String>(); colors['red'] = '#FF0000'; colors['green'] = '#00FF00'; colors['blue'] = '#0000FF'; print('First key: ${colors.keys.first}'); print('Last value: ${colors.values.last}'); print('First entry: ${colors.entries.first}'); }
We can access the first and last elements through keys, values, or entries. This is particularly useful for ordered collections like LinkedHashMap.
$ dart main.dart First key: red Last value: #0000FF First entry: MapEntry(red: #FF0000)
Removing Elements While Preserving Order
Removing elements from LinkedHashMap maintains the order of remaining entries.
import 'dart:collection'; void main() { var inventory = LinkedHashMap<String, int>(); inventory['apples'] = 10; inventory['bananas'] = 5; inventory['oranges'] = 8; inventory['pears'] = 12; print('Original: $inventory'); inventory.remove('bananas'); print('After remove: $inventory'); inventory.removeWhere((key, value) => value < 9); print('After removeWhere: $inventory'); }
When removing entries, the remaining elements keep their original order. The removeWhere method filters based on a condition while preserving order.
$ dart main.dart Original: {apples: 10, bananas: 5, oranges: 8, pears: 12} After remove: {apples: 10, oranges: 8, pears: 12} After removeWhere: {apples: 10, pears: 12}
Best Practices
- Order Matters: Use LinkedHashMap when insertion order is important.
- Memory Consideration: LinkedHashMap uses more memory than HashMap.
- Performance: Both have O(1) access time but LinkedHashMap has overhead.
- Key Consistency: Ensure keys have proper hashCode and == implementations.
Source
Dart LinkedHashMap Documentation
This tutorial covered Dart's LinkedHashMap with examples demonstrating its ordered nature and key features compared to regular HashMap.
Author
List all Dart tutorials.