
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.8 对象相等性
如果想要比较两个对象是否相等,则可以用==或与之相反的!=。举例如下:

这些操作实际上可以被应用于所有的对象,并不仅仅是基础类型。比如,可以用==来比较列表:

沿着这个方向,还可以比较不同类型的两个对象:

甚至可以拿对象与null做比较,或者与可能为null的对象做比较,并且不会抛出异常:

如你所见,==的实现很用心,大部分场合都能返回给你需要的相等性比较的结果。这背后的规则很简单:首先检查左侧是否为null,如果不为null,则调用equals方法。由于equals是一个方法,因此得到的确切比较逻辑取决于左侧参数的类型。由于有自动的null检查,因此我们不必亲自做这个检查。[10]
在这种比较逻辑下,对于不同的对象,只要它们的内容一致,且equals方法的实现也是完全基于内容的情况下,都会交出true答案。举例来说,下面是针对两个恰好拥有同样的5个字母的字符串的比较:

Scala的==与Java的==的不同
在Java中,可以用==来比较基本类型和引用类型。对基本类型而言,Java的==比较的是值的相等性,就像Scala的一样。但是对引用类型而言,Java的==比较的是引用相等性(reference equality),意思是两个变量指向JVM的堆上的同一个对象。Scala也提供了用于比较引用相等性的机制,即名称为eq的方法。不过,eq和与它对应的ne只对那些直接映射到Java对象的对象有效。关于eq和ne的完整细节会在17.1节和17.2节给出。关于如何编写一个好的equals方法,请参考第8章。