当 “” == s 为假但 “”.equals( s ) 为真时在哪些其他情况下:
编辑感谢您的及时回复。请看看真正的问题是什么。这次我把它变得大胆了。
我确实理解 == 和 .equals 之间的区别。所以,这不是我的问题(我实际上为此添加了一些上下文)
我正在对空字符串执行下面的验证:
if( "" == value ) {
// is empty string
}
过去,当从数据库获取值或从另一个节点反序列化对象时,此测试失败了,因为两个字符串实例确实是不同的对象引用,尽管它们包含相同的数据。
因此,解决这些情况的方法是
if( "".equals( value ) ) {
// which returns true for all the empty strings
}
我对此很好。这是显而易见的。
今天,这种情况再次发生,但它让我感到困惑,因为这次应用程序是一个非常小的独立应用程序,根本不使用网络,因此不会从数据库获取新字符串,也不会从另一个节点反序列化。
所以问题是:
在哪些其他情况下:
"" == value // yields false
和
"".equals( value ) // yields true
对于本地独立应用程序?
我很确定新的String()没有在代码中使用。
字符串引用可能是“”的唯一方法是因为它直接在代码中被分配“”(或者这就是我的想法),就像:
String a = "";
String b = a;
assert "" == b ; // this is true
不知何故(在阅读了代码之后,我有了一个线索)创建了两个不同的空字符串对象引用,我想知道如何
更多在jjnguys的答案:
字节!
编辑:结论
我已经找到了原因。
在jjnguy建议之后,我能够以不同的眼光看待代码。
有罪的方法:StringBuilder.toString()
分配并初始化一个新的 String 对象,以包含此对象当前表示的字符序列。
哎呀!...
StringBuilder b = new StringBuilder("h");
b.deleteCharAt( 0 );
System.out.println( "" == b.toString() ); // prints false
谜团解开了。
该代码使用 StringBuilder 来处理不断增长的字符串。事实证明,在某个时候,有人这样做了:
public void someAction( String string ) {
if( "" == string ) {
return;
}
deleteBankAccount( string );
}
和使用
someAction( myBuilder.toString() ); // bug introduced.
p.s. 我最近是否读了太多的 CodingHorror?或者为什么我觉得有必要在这里添加一些有趣的动物图片?