当前位置: 首页 > 知识库问答 >
问题:

在比较对象时,== 运算符在 dart 中究竟是如何工作的?

隆向晨
2023-03-14

因此,Dart API对==运算符这样说:

相等运算符。

所有对象的默认行为是,当且仅当此对象和其他对象是同一对象时,才返回true。

重写此方法以在类上指定不同的相等关系。重写方法仍然必须是等价关系。也就是说,它必须是:

Total:它必须为所有参数返回一个布尔值。它不应该扔。

反身:对于所有对象 o,o == o 必须为

对称:对于所有对象< code>o1和< code > O2 ,< code > O1 = = O2 和< code>o2 == o1必须要么都为< code>true,要么都为< code>false。

可传递:对于所有对象 o1o2o3,如果 o1 == o2o2 == o3,则 o1 == o3 必须为真

该方法还应该随着时间的推移保持一致,因此只有在至少修改了其中一个对象时,两个对象是否相等才会改变。

如果一个子类覆盖了等式操作符,那么它也应该覆盖hashCode方法以保持一致性。

但是,如果两个对象是相同的,Dart究竟如何检查呢?

当且仅当此对象和其他对象是同一个对象时,返回true

可以理解为“检查两个对象是否都是对同一实例的引用”,显然情况并非如此。

所以假设我有2个实例

class Car {
  int tires = 4;
  Color color = Colors.blue;
  int doors = 4;
}

Car carA = Car();
Car carB = Car();

根据我的理解,如果我检查carA==carB,Dart会通过循环两个实例来比较它们的所有属性?

如果是这种情况,它是否总是向下钻取到基元,例如,如果某些属性是非基元类?

谢谢

共有1个答案

壤驷德寿
2023-03-14

我相信Dart会“检查两个对象是否都是对同一实例的引用”。如果您想比较属性,您可以覆盖==运算符,例如:

class Car {
  int tires = 4;
  int doors = 4;

  @override
   bool operator ==(Object other) {
     return other is Car && this.tires == other.tires && this.doors == other.doors;
   } 
  @override
  int get hashCode => this.tires * this.doors;
}

void main() {
  Car carA = Car();
  Car carB = Car();
  print("equal ${carA==carB}");
  print("identical ${identical(carA,carB)}");
}

现在汽车是平等的。请注意,函数< code > identity()确实会检查同一个对象。

Dart规范指定常量对象检查属性,例如:

class ConstCar {
  final int tires = 4;
  final int doors = 4;
  const ConstCar();
}

void main() {
  ConstCar constCarA = const ConstCar();
  ConstCar constCarB = const ConstCar();
  print("equal ${constCarA==constCarB}");
  print("identical ${identical(constCarA,constCarB)}");
}

这返回 ==same() 的 true。

 类似资料:
  • 问题内容: 我正在阅读Kathy Sierra和Bert Bates编写的SCJP Java 6,这本书让我非常困惑。在第245页上,他们声明以下代码。 然后在下一页上,它们具有以下代码 我很困惑!当我自己尝试该方法时,似乎无法使用==来比较使用equals()方法的方式。即使Integer变量设置为相同的值(即10),使用==总是给我’false’。我对么?使用==比较相同的Integer对象(

  • 是否有调用ObjectLong.longValue()方法来比较Long和Long或其他方法?

  • 我有一个检查两个变量引用的代码,我遇到了这个有点混乱的情况: 结果是: 我的第一个问题是为什么第一个和第三个引用相等?如果第三个变量等于第二个变量,它应该是,因为它们的对象引用不相等。 当我将值更改为时,我感到困惑,如下所示: 然后结果变成: 为什么会这样?

  • 同样一个1000w的表,都有业务字段所索引 为什么oracle查起来很轻松,mysql就建议分库分表了。 是索引实现的区别导致的吗?还有底层IO读取的优化上的区别?还有哪些区别? 网上查的资料,讲的都太虚了,没讲到本质上

  • 此外,我重写了hashCode()以: 现在,即使两个对象都是@dog0,print语句也会打印false。想知道为什么控制台:

  • 我有一个将unitPrice设置为BigDecimal数据类型的域类。现在我正在尝试创建一种比较价格的方法,但似乎我不能在BigDecimal数据类型中使用比较运算符。我必须更改数据类型还是有其他方法?