Java核心技术卷I基础知识(原书第9版)
上QQ阅读APP看书,第一时间看更新

3.6.4 检测字符串是否相等

可以使用equals方法检测两个字符串是否相等。对于表达式:

如果字符串s与字符串t相等,则返回true;否则,返回false。需要注意,s与t可以是字符串变量,也可以是字符串常量。例如,下列表达式是合法的:

要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。

一定不能使用==运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上。当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。

如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。但实际上只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的。因此,千万不要使用==运算符测试字符串的相等性,以免在程序中出现糟糕的bug。从表面上看,这种bug很像随机产生的间歇性错误。

C++注释:对于习惯使用C++的string类的人来说,在进行相等性检测的时候一定要特别小心。C++的string类重载了==运算符以便检测字符串内容的相等性。可惜Java没有采用这种方式,它的字符串“看起来、感觉起来”与数值一样,但进行相等性测试时,其操作方式又类似于指针。语言的设计者本应该像对+那样也进行特殊处理,即重定义==运算符。当然,每一种语言都会存在一些不太一致的地方。

C程序员从不使用==对字符串进行比较,而使用strcmp函数。Java的compareTo方法与strcmp完全类似,因此,可以这样使用:

不过,使用equals看起来更为清晰。