![Scala编程(第4版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/353/38381353/b_38381353.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.8 对象相等性
如果你想要比较两个对象是否相等,可以用==或与之相反的!=。举例如下:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-119-2.jpg?sign=1739282376-UKGe9mQgMchEIGWJGWjV7lSzSgHrAjLo-0-7a3b6114822c3b13ec3d6f7842484632)
这些操作实际上可以被应用于所有的对象,并不仅仅是基础类型。比如,可以用==来比较列表:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-120-1.jpg?sign=1739282376-iPZwKKVQNyxdWq3ghkKydYmKSj3kkkxf-0-9af5595233ddffa504d8af9eb0da2faf)
继续沿着这个方向,还可以比较不同类型的两个对象:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-120-2.jpg?sign=1739282376-xXM72MfENHVTyVmnNc9CEN1MAr3GQ7Fo-0-f5b8deeca8fb88620f1e15c9e602eb2e)
甚至可以拿对象跟null做比较,或者跟可能为null的对象做比较。不会抛出异常:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-120-3.jpg?sign=1739282376-u4i7kPUziLC26gCJj6i9k3T3yRo2VAfw-0-d314348462186ab3191418fcfe5c7295)
如你所见,==的实现很用心,大部分场合都能返回给你需要的相等性比较的结果。这背后的规则很简单:首先检查左侧是否为null,如果不为null,调用equals方法。由于equals是个方法,你得到的确切比较逻辑取决于左侧参数的类型。由于有自动的null检查,你不必亲自做这个检查。[7]
这种比较逻辑对于不同的对象,只要它们的内容一致,且equals方法的实现也是完全基于内容的情况下,都会交出true答案。举例来说,以下是针对两个碰巧拥有同样的五个字母的字符串的比较:
![](https://epubservercos.yuewen.com/E8DF3B/20205397808551606/epubprivate/OEBPS/Images/40272-00-120-4.jpg?sign=1739282376-d18ySwISM1bjjTRarlnox57fZrHXXA1G-0-875b2cfe064a34c101f64cdb59e584f4)
Scala的==跟Java的==的不同
在Java中,可以用==来比较基本类型和引用类型。对基本类型而言,Java的==比较的是值的相等性,就跟Scala一样。但是对于引用类型,Java的==比较的是引用相等性(reference equality),意思是两个变量指向JVM的堆上的同一个对象。Scala也提供了用于比较引用相等性的机制,即名为eq的方法。不过,eq和跟它对应的ne只对那些直接映射到Java对象的对象有效。关于eq和ne的完整细节会在11.1节和11.2节给出。关于如何编写一个好的equals方法,请参考第30章。