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