一个插入有序的 Map,期望具有常数时间查找。
非常量映射字面量(如 {"a": 42, "b": 7}
)是 LinkedHashMap
。
keys、values 和 entries 都按 key 插入顺序迭代。
地图使用哈希表查找条目,因此键必须实现适当的 Object.operator== 和 Object.hashCode。如果哈希码的分布不够好,地图操作的性能可能会受到影响。
键插入顺序被记住,键按它们插入地图的顺序迭代。值和条目按对应键的顺序迭代。当键已存在于地图中时,更改键的值不会改变迭代顺序,但删除键并再次添加它将使其在迭代顺序中变为最后一个。
注意:不要在某个地图上执行操作(例如在调用 forEach 或 putIfAbsent 期间调用的函数)或正在迭代地图(keys、values 或 entries)时修改该地图。
LinkedHashMap
的键必须有一致性的 Object.== 和 Object.hashCode 实现。这意味着 ==
操作符必须在键上定义一个稳定的等价关系(自反的、对称的、传递性的,并且在时间上保持一致),并且对于由 ==
输出视为相等的对象,它们的 hashCode
必须相同。
示例
final planetsByDiameter = {0.949: 'Venus'}; // A new LinkedHashMap
将数据添加到地图中,请使用 operator[]、addAll 或 addEntries。
planetsByDiameter[1] = 'Earth';
planetsByDiameter.addAll({0.532: 'Mars', 11.209: 'Jupiter'});
要检查地图是否为空,请使用 isEmpty 或 isNotEmpty。要获取地图条目的数量,请使用 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}
要根据是否已存在具有该键的条目,有条件地添加或修改特定键的值,请使用 putIfAbsent 或 update。
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 按排序顺序迭代键。
- 实现类型
-
- Map<K, V>
构造函数
- LinkedHashMap({bool equals(K, K)?, int hashCode(K)?, bool isValidKey(dynamic)?})
- 创建一个基于Map的插入顺序哈希表。工厂
- LinkedHashMap.from(Map other)
- 创建一个包含
other
中所有键值对的LinkedHashMap。工厂 -
LinkedHashMap.fromEntries(Iterable<
MapEntry< entries)K, V> > - 创建一个包含
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
关联到values
的LinkedHashMap。工厂 - 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< ) → voidK, V> other - 将
other
中的所有键/值对添加到此映射中。继承 -
addEntries(
Iterable< MapEntry< newEntries) → voidK, V> > - 将
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 - 更新所有值。继承