我应该使用string.isEmpty()或“”.equals(string)?
标题基本上说了这一切。 我通常一起testing这个string == null
,所以我并不真正担心一个空安全testing。 我应该用哪个?
String s = /* whatever */; ... if (s == null || "".equals(s)) { // handle some edge case here }
要么
if (s == null || s.isEmpty()) { // handle some edge case here }
在这个笔记 – 做isEmpty()
甚至做任何事情,除了return this.equals("");
或return this.length() == 0;
?
"".equals(s)
的主要好处是你不需要空检查( equals
将检查它的参数,如果它为null,则返回false
),你似乎并不在乎。 如果你不担心s
是null(或者是否检查它),我肯定会使用s.isEmpty()
; 它显示了你正在检查的内容,你关心的是否是空的,而不是它是否等于空string
String.equals("")
实际上比只是一个isEmpty()
调用慢一点。 string存储在构造函数中初始化的countvariables,因为string是不可变的。
isEmpty()
比较countvariables为0,而equals将检查types,string长度,然后迭代string比较大小是否匹配。
所以要回答你的问题, isEmpty()
实际上会less得多! 这是一件好事。
除了上面提到的其他问题之外,还有一件事情可能需要考虑: isEmpty()
是在1.6中引入的,因此如果使用它,将无法在Java 1.5或更低版本上运行代码。
你可以使用apache commons的StringUtils isEmpty()或isNotEmpty()。
这并不重要。 "".equals(str)
在我看来更加清晰。
isEmpty()
返回count == 0
;
我写了一个可以testing性能的testing程序类:
public class Tester { public static void main(String[] args) { String text = ""; int loopCount = 10000000; long startTime, endTime, duration1, duration2; startTime = System.nanoTime(); for (int i = 0; i < loopCount; i++) { text.equals(""); } endTime = System.nanoTime(); duration1 = endTime - startTime; System.out.println(".equals(\"\") duration " +": \t" + duration1); startTime = System.nanoTime(); for (int i = 0; i < loopCount; i++) { text.isEmpty(); } endTime = System.nanoTime(); duration2 = endTime - startTime; System.out.println(".isEmpty() duration "+": \t\t" + duration2); System.out.println("isEmpty() to equals(\"\") ratio: " + ((float)duration2 / (float)duration1)); } }
我发现使用.isEmpty()占用了.equals(“”)大约一半的时间。
- 尝试使用AESencryption和解密string时发生IllegalBlockSizeException
- Spring vs EJB。 Spring可以取代EJB吗?
- 我如何让Selenium-WebDriver在Java中等待几秒钟?
- 我可以发现一个Java类声明的内部类使用reflection吗?
- JDK 8中的Javadoc:无效的“自闭元素不允许”
- 多态:为什么使用“List list = new ArrayList”而不是“ArrayList list = new ArrayList”?
- 为什么间接递增比直接公司更快?
- 差异com.sun.jersey和org.glassfish.jersey
- 进行循环优化