一个插入有序的 Map,期望具有常数时间查找。

非常量映射字面量(如 {"a": 42, "b": 7})是 LinkedHashMap

keysvaluesentries 都按 key 插入顺序迭代。

地图使用哈希表查找条目,因此键必须实现适当的 Object.operator==Object.hashCode。如果哈希码的分布不够好,地图操作的性能可能会受到影响。

键插入顺序被记住,键按它们插入地图的顺序迭代。值和条目按对应键的顺序迭代。当键已存在于地图中时,更改键的值不会改变迭代顺序,但删除键并再次添加它将使其在迭代顺序中变为最后一个。

注意:不要在某个地图上执行操作(例如在调用 forEachputIfAbsent 期间调用的函数)或正在迭代地图(keysvaluesentries)时修改该地图。

LinkedHashMap 的键必须有一致性的 Object.==Object.hashCode 实现。这意味着 == 操作符必须在键上定义一个稳定的等价关系(自反的、对称的、传递性的,并且在时间上保持一致),并且对于由 == 输出视为相等的对象,它们的 hashCode 必须相同。

示例

final planetsByDiameter = {0.949: 'Venus'}; // A new LinkedHashMap

将数据添加到地图中,请使用 operator[]addAlladdEntries

planetsByDiameter[1] = 'Earth';
planetsByDiameter.addAll({0.532: 'Mars', 11.209: 'Jupiter'});

要检查地图是否为空,请使用 isEmptyisNotEmpty。要获取地图条目的数量,请使用 length

print(planetsByDiameter.isEmpty); // false
print(planetsByDiameter.length); // 4
print(planetsByDiameter);
// {0.949: Venus, 1.0: Earth, 0.532: Mars, 11.209: Jupiter}

forEach 方法调用于地图的每个 key/value 条目调用一个函数。

planetsByDiameter.forEach((key, value) {
  print('$key \t $value');
  // 0.949    Venus
  // 1.0      Earth
  // 0.532    Mars
  // 11.209   Jupiter
});

要检查地图是否具有具有特定键的条目,请使用 containsKey

final keyOneExists = planetsByDiameter.containsKey(1); // true
final keyFiveExists = planetsByDiameter.containsKey(5); // false

要检查地图是否具有具有特定值的条目,请使用 containsValue

final earthExists = planetsByDiameter.containsValue('Earth'); // true
final saturnExists =  planetsByDiameter.containsValue('Saturn'); // false

要删除具有特定键的条目,请使用 remove

final removedValue = planetsByDiameter.remove(1);
print(removedValue); // Earth
print(planetsByDiameter); // {0.949: Venus, 0.532: Mars, 11.209: Jupiter}

要同时删除多个条目,基于它们的键和值,请使用 removeWhere

planetsByDiameter.removeWhere((key, value) => key == 0.949);
print(planetsByDiameter); // {0.532: Mars, 11.209: Jupiter}

要根据是否已存在具有该键的条目,有条件地添加或修改特定键的值,请使用 putIfAbsentupdate

planetsByDiameter.update(0.949, (v) => 'Venus', ifAbsent: () => 'Venus');
planetsByDiameter.putIfAbsent(0.532, () => "Another Mars if needed");
print(planetsByDiameter); // {0.532: Mars, 11.209: Jupiter, 0.949: Venus}

要基于现有的键和值更新所有键的值,请使用 updateAll

planetsByDiameter.updateAll((key, value) => 'X');
print(planetsByDiameter); // {0.532: X, 11.209: X, 0.949: X}

要删除所有条目并清空地图,请使用 clear

planetsByDiameter.clear();
print(planetsByDiameter); // {}
print(planetsByDiameter.isEmpty); // true

另请参考

  • Map,键/值对集合的通用接口。
  • HashMap 是无序的(迭代顺序没有保证)。
  • SplayTreeMap 按排序顺序迭代键。
实现类型

构造函数

LinkedHashMap({bool equals(K, K)?, int hashCode(K)?, bool isValidKey(dynamic)?})
创建一个基于Map的插入顺序哈希表。
工厂
LinkedHashMap.from(Map other)
创建一个包含other中所有键值对的LinkedHashMap
工厂
LinkedHashMap.fromEntries(Iterable<MapEntry<K, V>> entries)
创建一个包含entries条目的LinkedHashMap
工厂
LinkedHashMap.fromIterable(Iterable iterable, {K key(dynamic element)?, V value(dynamic element)?})
创建一个从iterable中计算键和值的LinkedHashMap
工厂
LinkedHashMap.fromIterables(Iterable<K> keys, Iterable<V> values)
创建一个将给定的keys关联到valuesLinkedHashMap
工厂
LinkedHashMap.identity()
创建一个基于插入顺序的基于标识的LinkedHashMap
工厂
LinkedHashMap.of(Map<K, V> other)
创建一个包含other中所有键值对的LinkedHashMap。示例
工厂

属性

entries Iterable<MapEntry<K, V>>
LinkedHashMap的映射条目。
没有setter继承
hashCode int
此对象的哈希码。
没有setter继承
isEmpty bool
判断映射中是否没有键/值对。
没有setter继承
isNotEmpty bool
判断映射中是否至少有一个键/值对。
没有setter继承
keys Iterable<K>
本映射的键。
没有setter继承
length int
映射中键/值对的数目。
没有setter继承
runtimeType Type
表示对象运行时类型的表示形式。
没有setter继承
values Iterable<V>
本映射的值。
没有setter继承

方法

addAll(< span class=" parameter " id="addAll-param-other">Map<K, V> other) → void
other 中的所有键/值对添加到此映射中。
继承
addEntries(Iterable<MapEntry<K, V>> newEntries) → void
newEntries 的所有键/值对添加到此映射中。
继承
cast<RK, RV>() Map<RK, RV>
提供以 RK 键和 RV 实例为视图的此映射,如果需要的话。
继承
clear() → void
从映射中删除所有条目。
继承
containsKey(Object? key) bool
此映射是否包含给定的 key
继承
containsValue(Object? value) bool
此映射是否包含给定的 value
继承
forEach(void action(K key, V value)) → void
action 应用于映射中的每个键/值对。
继承
map<K2, V2> (MapEntry<K2, V2> convert(K key, V value)) Map<K2, V2>
返回一个新的映射,其中该映射的所有条目都通过给定的 convert 函数进行转换。
继承
noSuchMethod(Invocation invocation) → dynamic
当访问不存在的属性或方法时触发。
继承
putIfAbsent(K key, V ifAbsent()) → V
查找 key 的值,如果不存在,则添加一个新条目。
继承
remove(Object? key) → V?
如果存在,从映射中删除 key 和其关联的值。
继承
removeWhere(bool test(K key, V value)) → void
删除满足给定 test 的此映射的所有条目。
继承
toString() String
表示此对象的一个字符串。
继承
update(K key, V update(V value), {V ifAbsent()?}) → V
更新提供的 key 的值。
继承
updateAll(V update(K key, V value)) → void
更新所有值。
继承

运算符

operator ==(Object other) bool
等号运算符。
继承
操作符 [](Object? ) → V?
给定的值,如果不在映射中,则返回null
继承
操作符 []=(K , V ) → void
与给定的关联。
继承