【发布时间】:2010-11-09 19:46:57
【问题描述】:
编辑 感谢您的及时回复。请看看真正的问题是什么。这次我把它加粗了。
我确实了解 == 和 .equals 之间的区别。所以,这不是我的问题(我实际上为此添加了一些上下文)
我正在对空字符串执行以下验证:
if( "" == value ) {
// is empty string
}
过去在从数据库中获取值或从另一个节点反序列化对象时,此测试失败,因为两个字符串实例确实是不同的对象引用,尽管它们包含相同的数据。
所以解决这些情况的方法是
if( "".equals( value ) ) {
// which returns true for all the empty strings
}
我很好。这很清楚。
今天又出现了这种情况,但是让我很困惑,因为这次的应用是一个非常小的独立应用,根本不使用网络,所以没有新的字符串是从数据库中获取的,也不是从另一个节点反序列化的。
所以问题是:
在哪种其他情况下:
"" == value // yields false
和
"".equals( value ) // yields true
对于本地独立应用程序?
我很确定 new 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.
附言我最近读太多 CodingHorror 了吗?或者为什么我觉得有必要在这里添加一些有趣的动物图片?
【问题讨论】:
-
if (value != null && value.length == 0) { ... },你应该使用 equals 因为 == 对象比较引用,即它们是同一个对象。虽然在编译时 Java 会找到相同的字符串并让它们共享相同的引用(字符串是不可变的),但在运行时很容易创建具有不同引用的空字符串。
-
正如我的回答所暗示的......忘记你的“想法”。如果您要检查某些内容是否与空字符串具有相同的值,请使用 equals。您正试图依赖编译器来实习您的字符串,Josh Bloch 指出这不是程序员的工具:-)。见下文。
-
现在有几个答案显示了简单的字符串操作,这些操作会产生不同的零长度字符串对象。网络和善良与这些答案无关。
-
(我可以打断一下
String.isEmpty,从 1.6 开始。谢谢。) -
(哦,是的,FindBugs 会警告这类事情。)
标签: java comparison equals equality