![Scala编程(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/446/43738446/b_43738446.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.8 对象相等性
如果想要比较两个对象是否相等,则可以用==或与之相反的!=。举例如下:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-117-2.jpg?sign=1739599759-4vHxzyTYVpU0wmzU77JnMPt3fZM4dvZz-0-36ebd5b4e82339aaeb9fa9f26a95a4b9)
这些操作实际上可以被应用于所有的对象,并不仅仅是基础类型。比如,可以用==来比较列表:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-118-1.jpg?sign=1739599759-0PBdA0JSOSFr5njUjiyXlTWIPkN8nCkA-0-e17fabdde90829376b8e81fd79e6fdaf)
沿着这个方向,还可以比较不同类型的两个对象:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-118-2.jpg?sign=1739599759-RxkcTermvr8mPfOMW7abWqJPEf5jzlJA-0-ad338d7635f8ef969e683753d658f0c6)
甚至可以拿对象与null做比较,或者与可能为null的对象做比较,并且不会抛出异常:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-118-3.jpg?sign=1739599759-7PrZjOGlSarKGsED7lEveJxsvHQD1k9G-0-e914d5e29f2506ce73a5d2db779a6320)
如你所见,==的实现很用心,大部分场合都能返回给你需要的相等性比较的结果。这背后的规则很简单:首先检查左侧是否为null,如果不为null,则调用equals方法。由于equals是一个方法,因此得到的确切比较逻辑取决于左侧参数的类型。由于有自动的null检查,因此我们不必亲自做这个检查。[10]
在这种比较逻辑下,对于不同的对象,只要它们的内容一致,且equals方法的实现也是完全基于内容的情况下,都会交出true答案。举例来说,下面是针对两个恰好拥有同样的5个字母的字符串的比较:
![](https://epubservercos.yuewen.com/9944D7/23020655409775506/epubprivate/OEBPS/Images/42832-00-118-4.jpg?sign=1739599759-jMy5wWljr4ZKbGyWUz5WtJyaKLIJz0RR-0-58e341444a81c614ab8907bd03d43f0e)
Scala的==与Java的==的不同
在Java中,可以用==来比较基本类型和引用类型。对基本类型而言,Java的==比较的是值的相等性,就像Scala的一样。但是对引用类型而言,Java的==比较的是引用相等性(reference equality),意思是两个变量指向JVM的堆上的同一个对象。Scala也提供了用于比较引用相等性的机制,即名称为eq的方法。不过,eq和与它对应的ne只对那些直接映射到Java对象的对象有效。关于eq和ne的完整细节会在17.1节和17.2节给出。关于如何编写一个好的equals方法,请参考第8章。