HashMap<K, V> 构造函数

HashMap<K, V>({
  1. bool equals(
    1. K,
    2. K
    )?,
  2. int hashCode(
    1. K
    )?,
  3. bool isValidKey(
    1. dynamic
    )?,
})

创建一个基于 Map 的无序散列表。

创建的映射不按任何顺序排列。遍历键或值时,迭代顺序是不确定的,除非在映射更改时保持不变。

如果提供了 equals,则用于比较映射中的键与新键。如果省略了 equals,则使用键的自身 Object.== 进行比较。

类似地,如果提供了 hashCode,则用于为键生成哈希值,以便将它们放入映射中。如果省略了 hashCode,则使用键的自身 Object.hashCode

使用的 equalshashCode 方法应该始终一致,以便如果 equals(a, b),则 hashCode(a) == hashCode(b)。对象的哈希值,或与之比较相等的值,在对象作为映射中的键期间不应改变。如果它改变了,结果是不可预测的。

如果您提供了 equalshashCode 之一,通常也应该提供另一个。

某些 equalshashCode 函数可能不适用于所有对象。如果提供了 isValidKey,则用于检查潜在的键,这些键不一定是 K 的实例,如 operator []removecontainsKey 的参数,这些参数的类型为 Object?。如果 isValidKey 返回 false,则对于该对象,不调用 equalshashCode 函数,并且假定映射中没有与该对象相等的键。默认情况下,isValidKey 函数仅检查对象是否为 K 的实例。

示例

HashMap<int,int>(equals: (int a, int b) => (b - a) % 5 == 0,
                 hashCode: (int e) => e % 5)

此示例映射不需要传递 isValidKey 函数。默认函数仅接受精确的 int 值,可以安全地传递给 equalshashCode 函数。

如果既没有提供 equalshashCode 也没有 isValidKey,则默认的 isValidKey 接受所有键。默认的相等性和哈希码操作已知适用于所有对象。

同样,如果 equalsidenticalhashCodeidentityHashCode 并且省略了 isValidKey,则结果映射是身份基础,并且默认的 isValidKey 接受所有键。可以使用 HashMap.identity 直接创建此类映射。

实现

external factory HashMap(
    {bool Function(K, K)? equals,
    int Function(K)? hashCode,
    bool Function(dynamic)? isValidKey});