LinkedHashMap<K, V> 构造函数
创建一个基于插入顺序的哈希表。
如果提供了 equals
,则使用它来比较表中与新键的键。如果没有提供 equals
,则使用键的自身 Object.==。
同样,如果提供了 hashCode
,则使用它来生成键的哈希值,以便将它们放置在哈希表中。如果没有提供,则使用键的自身 Object.hashCode。
使用的 equals
和 hashCode
方法应该始终一致,以便如果 equals(a, b)
则 hashCode(a) == hashCode(b)
。对象的哈希值或与之相等的值在对象在表中时不应改变。如果它改变了,结果是不可预测的。
如果您提供其中一个 equals
或 hashCode
,通常也应提供另一个。
某些 equals
或 hashCode
函数可能不适用于所有对象。如果提供了 isValidKey
,则用于检查一个潜在的键,该键不一定是 K
的实例,如 operator []、remove 和 containsKey 的参数,它们被类型化为 Object?
。如果 isValidKey
返回 false
,则对该对象的 equals
和 hashCode
函数不会被调用,并且假设没有与该对象相等的关键字在映射中。默认情况下,isValidKey
函数仅检查对象是否是 K
的实例。
示例
LikedHashMap<int,int>(equals: (int a, int b) => (b - a) % 5 == 0,
hashCode: (int e) => e % 5)
此示例映射不需要传递 isValidKey
函数。默认函数仅接受精确的 int
值,可以安全地传递给 equals
和 hashCode
函数。
如果没有提供 equals
、hashCode
或 isValidKey
,则默认的 isValidKey
接受所有键。默认的相等性和哈希码操作假设适用于所有对象。
同样,如果 equals
是 identical,hashCode
是 identityHashCode,并且省略了 isValidKey
,则结果映射是基于身份的,并且 isValidKey
默认接受所有键。此类映射可以直接使用 LinkedHashMap.identity 创建。
实现
external factory LinkedHashMap(
{bool Function(K, K)? equals,
int Function(K)? hashCode,
bool Function(dynamic)? isValidKey});