Dart Set<E> 如何比较项目?

How does Dart Set<E> compare items?

我只是在 Dart 中将一堆 MyClass 塞进了 Set 中。 MyClass 没有实现 Comparable,也没有定义 == 运算符。它编译得很好。

为了 Set 正确检测重复项,我是否必须实现 Comparable 接口,或者只是重写 == 运算符?

所有 Dart classes 派生自 Object,它确实提供了 operator ==hashCodeObject 的默认实现检查对象 身份 ;您的 class 的一个实例将只与它自己进行比较。

如果您希望两个不同的实例能够比较相等,那么您需要:

  • 在您的自定义 class 中实施 operator ==hashCodeSet 的默认实现是 LinkedHashSet,它不使用 Comparable。 (有一个 SplayTreeSet implementation 确实使用了 Comparable,但是查找和插入的时间复杂度为 O(log n) 而不是 O(1)。)
  • 或者使用 LinkedHashSet constructor or the HashSet constructor 并传递适当的回调以计算相等性和哈希码。