2010-07-13 48 views
9

我一直在看一些由各种人写的GWT代码,并有不同的方式比较字符串。我很好奇,如果这只是一种风格选择,或者一个比另一个更优化:Java字符串比较:样式选择还是优化?

"".equals(myString); 

myString.equals(""); 

myString.isEmpty(); 

是否有区别?

+0

你问的只是比较*空*字符串引用,或字符串文字和字符串引用一般? – seh 2010-07-13 21:29:12

回答

14
"".equals(myString); 

不会抛出NullPointerException如果myString为null。这就是为什么很多开发人员使用这种形式。

myString.isEmpty(); 

是最好的方式,如果myString永远不能为null,因为它解释是怎么回事。编译器可以优化这个或者myString.equals(""),所以它更像是一种风格选择。 isEmpty()显示你的意图好于equals(""),所以它通常是首选。

+2

当然你对“”.equals(myString)是正确的,但是我发现这种故意落后的语法伤害了我的眼睛。我认为如果你的代码遇到了一种情况,那就是你不能确定一个String值是否为空,那么很可能会有一个潜在的逻辑问题被抹掉。 – 2010-07-13 21:32:51

+2

@Carl我发现括号外的双引号看起来更好。但绝对说NPE早期和经常是空的。 – 2010-07-13 21:44:26

+0

isEmpty()效率更高,因为它只针对0测试字符串长度,而equals则涉及转换,比较哈希代码等等。请参阅http://www.docjar.com/docs/api/java/lang/String.html – helpermethod 2010-07-13 22:18:52

-3

使用“”的两个选项都可能需要创建一个临时String对象,但.isEmpty()函数不应该这样做。

如果他们打扰到把.isEmpty()函数放在我说它可能是最好的使用它!

+4

如果空字符串常量在启动后不久就不是任何JRE实习生池的一部分,我会感到非常惊讶。一旦在类加载器中的任何地方使用了这样一个常量,它就会一直保持可用,直到JVM退出,所以我不会太在意性能。 – 2010-07-13 21:30:25

+0

isEmpty()是作为一种方便的方法添加的。在此之前,你必须像这样检查字符串长度为空:if(s.length()== 0)。 – helpermethod 2010-07-13 22:24:55

2

apache StringUtils为字符串操作提供了一些便利方法。

http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html#isBlank(java.lang.CharSequence)

检查出方法和相关的。

+0

'isEmpty'对你来说不够吗? – 2010-07-13 21:42:37

+0

为什么我投票给我下巴?我的意思是,StringUtils的优点是你增加了代码的一致性,所以你没有“”.equals(blah)和blah.equals(“”)。 – hvgotcodes 2010-07-13 21:46:05

+1

@Tom嗯,'StringUtils'方法是无效的。 – 2010-07-13 21:49:50

5

请注意,在Java 6中添加了isEmpty(),但不幸的是,如果您不支持Java 1.4,仍然有人抱怨声音很大。

+0

很好知道。 – KevMo 2010-07-13 21:53:32

0

如果您正在使用最新版本的Java(1.6),myString.isEmpty()可能是最好的。它可能比myString.equals(“”)执行得更好,因为它只需要检查一个字符串。

“”.equals(myString)具有不抛出空指针异常的属性,如果myString为null。然而,仅仅因为这个原因,我会避免它,因为如果你遇到意外的情况通常会更快失败。否则,未来的一些小错误将很难追查到......

myString.equals(“”)是希望保持与旧Java版本的兼容性的最自然/惯用的方法,只是想明确他们的比较。