抄自Java核心技术卷1 基础篇
一定不要使用==运算符检测两个字符串是否相等!
这个运算符只能确定两个字符串是否在同一个位置。
当然,如果字符串放置在同一个位置,它们必然相等。
但是,完全有可能将内容相同的字符串的拷贝位置放在不同的位置上。
String a1 = "Hello";
System.out.println(a1.equals("Hello")); //true
System.out.println(a1 == "Hello"); //true
System.out.println(a1.substring(0, 3).equals("Hel")); //true
System.out.println(a1.substring(0, 3) == "Hel"); //false
如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。
但实际上只有字符串常量是共享的,而 + 或者 substring 等操作产生的结果并不是共享的。
因此,千万不要使用 ==运算符测试字符串的相等性,以免在程序中出现糟糕的bug。
从表面上看,这种bug很像随机产生的间歇性错误。