一定不要使用 == 检测两个字符串是否相等!

== 这个运算符只能够确定两个字符串是否放置在同一个位置(地址)上。

如果两个字符串放置在同一个位置上,它们必然相等。

但是完全有可能将内容相同的多个字符串的拷贝位置放在不同的位置上。

比如 str1 = "Hello",str2 = "Hello",但是两个字符串地址不同,那么 == 将返回 false。

String greeting = "Hello";    // initialize greeting to a string
if (greeting == "Hello")...    // probably true
if (greeting.substring(0,3) == "Hel")...    // probably false

如果始终将相同的字符串共享,就可以使用==检测是否相等。

但实际上只有字符串常量是共享的,而 + 或 substring 等操作产生的结果并不是共享的。

因此,千万不要使用 == 检测字符串的相等性。不然很容易出现bug。


Java中检测字符串相等可以用以下的方法:

  • equals方法:检测两个字符串是否相等。
public boolean equals(Object anObject)  

将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。  
如s.equals(t),如果字符串s与t相等,返回true;否则返回false。
可以是字符串变量,也可以是字符串字面量。如"Hello".equals(greeting)是合法的。

  • equalsIgnoreCase方法:检测两个字符串是否相等,不区分大小写。
public boolean equalsIgnoreCase(String anotherString)

检测两个字符串是否相等,而不区分大小写。如 "Hello".equalsIgnoreCase("hello")  。

  • compareTo方法:与C语言中的strcmp完全类似。
public int compareTo(String anotherString)

按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo只在方法 equals(Object) 返回 true 时才返回0。可以这样使用:if (greeting.compareTo("Hello") == 0) ......

  • compareToIgnoreCase方法:跟上面的compareTo一样,只是不区分大小写。
public int compareToIgnoreCase(String str)

参考:

Java核心技术 卷I - 基础知识(原书第10版)

Java™ Platform Standard Edition 6 的 API 规范