Scala编程实战(原书第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 字符串的相等性判断

问题

你想要知道如何比较两个字符串是否相等,即它们所包含的字符序列是否相同。

解决方案

在Scala中,可以通过==运算符来比较两个字符串。对于下面这些字符串:

可以像下面这样来测试它们是否相等:

使用==方法的好处在于即使一个字符串是null,在测试的过程中也不会抛出NullPointer-Exception:

如果想以不区分大小写的方式比较两个字符串,一种方法是将两个字符串都转换成大写或者小写再通过==进行比较:

同样,也可以使用Java字符串提供的equalsIgnoreCase方法:

注意,虽然对null字符串进行相等测试不会抛出异常,但对null字符串调用方法则会抛出NullPointerException:

讨论

在Scala中使用==来判断两个对象是否相等,这和Java使用equals来判断两个对象相等是不一样的。

==方法是定义在所有引用类型的基类AnyRef上的,它会先检查是否是null值,然后对第一个对象调用equals方法来测试这两个对象是否相等。因此,当比较字符串相等时,不需要检查null。

最好不要使用null

在日常使用Scala时,从来不需要使用null值。本小节中的讨论旨在帮助你理解==是如何工作的,尤其是当你使用Java库或者其他库遇到null值时。

如果想像Java或其他类似的语言那样使用null值,建议使用Option来代替。我发现,如果假设Scala没有null关键字,对写代码会很有帮助。请参阅24.6节来获取更多的例子与信息。

在Scala 3中甚至可以改变类型系统,将那些继承自AnyRef的类型(如String、List和Option等)设置成不可为空。使用实验性的编译器选项-Yexplicit-nulls,通过改变Scala的类型继承关系使得下面这段代码无法通过编译:

请参阅“Scala显式使用null”网页(https://docs.scala-lang.org/scala3/reference/expe-rimental/explicit-nulls.html)获取更多信息。

另见

更多关于==和equals方法定义的信息,请参阅5.9节。