我一直在看一些由各种人写的GWT代码,并有不同的方式比较字符串。我很好奇,如果这只是一种风格选择,或者一个比另一个更优化:Java字符串比较:样式选择还是优化?
"".equals(myString);
myString.equals("");
myString.isEmpty();
是否有区别?
我一直在看一些由各种人写的GWT代码,并有不同的方式比较字符串。我很好奇,如果这只是一种风格选择,或者一个比另一个更优化:Java字符串比较:样式选择还是优化?
"".equals(myString);
myString.equals("");
myString.isEmpty();
是否有区别?
"".equals(myString);
不会抛出NullPointerException
如果myString
为null。这就是为什么很多开发人员使用这种形式。
myString.isEmpty();
是最好的方式,如果myString
永远不能为null,因为它解释是怎么回事。编译器可以优化这个或者myString.equals("")
,所以它更像是一种风格选择。 isEmpty()
显示你的意图好于equals("")
,所以它通常是首选。
当然你对“”.equals(myString)是正确的,但是我发现这种故意落后的语法伤害了我的眼睛。我认为如果你的代码遇到了一种情况,那就是你不能确定一个String值是否为空,那么很可能会有一个潜在的逻辑问题被抹掉。 – 2010-07-13 21:32:51
@Carl我发现括号外的双引号看起来更好。但绝对说NPE早期和经常是空的。 – 2010-07-13 21:44:26
isEmpty()效率更高,因为它只针对0测试字符串长度,而equals则涉及转换,比较哈希代码等等。请参阅http://www.docjar.com/docs/api/java/lang/String.html – helpermethod 2010-07-13 22:18:52
使用“”的两个选项都可能需要创建一个临时String对象,但.isEmpty()函数不应该这样做。
如果他们打扰到把.isEmpty()函数放在我说它可能是最好的使用它!
如果空字符串常量在启动后不久就不是任何JRE实习生池的一部分,我会感到非常惊讶。一旦在类加载器中的任何地方使用了这样一个常量,它就会一直保持可用,直到JVM退出,所以我不会太在意性能。 – 2010-07-13 21:30:25
isEmpty()是作为一种方便的方法添加的。在此之前,你必须像这样检查字符串长度为空:if(s.length()== 0)。 – helpermethod 2010-07-13 22:24:55
apache StringUtils为字符串操作提供了一些便利方法。
检查出方法和相关的。
'isEmpty'对你来说不够吗? – 2010-07-13 21:42:37
为什么我投票给我下巴?我的意思是,StringUtils的优点是你增加了代码的一致性,所以你没有“”.equals(blah)和blah.equals(“”)。 – hvgotcodes 2010-07-13 21:46:05
@Tom嗯,'StringUtils'方法是无效的。 – 2010-07-13 21:49:50
如果您正在使用最新版本的Java(1.6),myString.isEmpty()可能是最好的。它可能比myString.equals(“”)执行得更好,因为它只需要检查一个字符串。
“”.equals(myString)具有不抛出空指针异常的属性,如果myString为null。然而,仅仅因为这个原因,我会避免它,因为如果你遇到意外的情况通常会更快失败。否则,未来的一些小错误将很难追查到......
myString.equals(“”)是希望保持与旧Java版本的兼容性的最自然/惯用的方法,只是想明确他们的比较。
你问的只是比较*空*字符串引用,或字符串文字和字符串引用一般? – seh 2010-07-13 21:29:12