HashSet<E>构造函数

HashSet<E>({
  1. bool equals(
    1. E,
    2. E
    )?,
  2. int hashCode(
    1. E
    )?,
  3. bool isValidKey(
    1. dynamic
    )?,
})

使用提供的equals作为等价关系创建一个哈希集。

提供的equals必须定义一个稳定的等价关系,并且hashCode必须与equals保持一致。

如果省略了equalshashCode,则集合使用元素的固有Object.==Object.hashCode

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

一些equalshashCode函数可能不适用于所有对象。如果提供了isValidKey,它用于检查一个可能是E实例的对象,例如contains的参数,它被类型化为Object?。如果isValidKey返回false,则对于对象,不调用equalshashCode函数,并且假定没有与该对象相等的键存在于映射中。默认的isValidKey函数仅测试对象是否为E的实例,这意味着

HashSet<int>(equals: (int e1, int e2) => (e1 - e2) % 5 == 0,
             hashCode: (int e) => e % 5)

不需要isValidKey参数,因为它默认仅接受既被equals又被hashCode接受的int值。

如果没有提供equalshashCodeisValidKey,则默认的isValidKey接受所有值。默认的相等性和散列码操作假定适用于所有对象。

同样,如果equalsidenticalhashCodeidentityHashCode,并且省略了isValidKey,则生成的集合是基于身份的,并且默认的isValidKey接受所有键。可以使用HashSet.identity直接创建这样的映射。

实现

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