我应该使用string.isEmpty()还是"".equals(string)?

Mat*_*all 168 java string

标题基本上都说明了一切.我通常在一起测试这个string == null,所以我并不真正关心一个零安全测试.我应该使用哪个?

String s = /* whatever */;
...
if (s == null || "".equals(s))
{
    // handle some edge case here
}
Run Code Online (Sandbox Code Playgroud)

要么

if (s == null || s.isEmpty())
{
    // handle some edge case here
}
Run Code Online (Sandbox Code Playgroud)

在那个笔记 - isEmpty()甚至做除了return this.equals("");或以外的任何事情return this.length() == 0;

Mic*_*zek 246

主要的好处"".equals(s)是你不需要 null检查(equals将检查它的参数并返回false它是否为null),你似乎并不关心.如果你不担心s是否为空(或以其他方式检查它),我肯定会使用s.isEmpty(); 它显示了您正在检查的内容,您关心的是否s为空,而不是它是否等于空字符串

  • 谢谢你的解释.现在我知道为什么赞成".equals(str)而不是str.equals("")!我总是想知道为什么其他人经常使用这个,但没有考虑空值.太棒了:-) (29认同)
  • @RenniePet这并不像是有任何魔法.如果`s`为null,则不能在其上调用方法 - 它为null.``"`永远不会为null,所以你可以安全地调用它上面的方法,`equals()`可以处理它的参数为null的情况 (12认同)
  • 恕我直言,在上面的例子中仍然需要进行空检查,因为我们假设条件对于空值应该为真.s == null || "" .equals(S) (10认同)
  • @ Master.Aurora不,如果`getValue()`返回null,当调用`toString()`时,你会得到一个NullPointerException (5认同)
  • 关于性能的注释:`isEmpty()`检查私有数组的内部长度,而`equals(Object anObject)`做更多的事情(例如检查`instanceof`).在perfromance方面,`isEmpty()`通常更快. (5认同)

Dav*_*ung 81

String.equals("")实际上比isEmpty()调用慢一点.字符串存储在构造函数中初始化的计数变量,因为字符串是不可变的.

isEmpty() 将count变量与0进行比较,而equals将检查类型,字符串长度,然后迭代字符串以进行比较(如果大小匹配).

所以回答你的问题,isEmpty()实际上会少做很多!这是一件好事.

  • 我认为在这种情况下,差异不适用; 永远不会对字符串进行迭代以进行比较,因为大小不匹配(除非字符串实际上是空的,然后没有要迭代的字符) (3认同)
  • 是真的,但是等于你首先进行引用检查,看它们是否是同一个对象,然后是一个instanceof,然后是一个转换为String,一个长度检查,最后是迭代.如果两个字符串都是空的,那么它只是一个简单的参考检查. (2认同)

Fab*_*eeg 17

除了提到的其他问题之外,您可能还需要考虑的一件事是isEmpty()1.6中引入的,因此如果您使用它,您将无法在Java 1.5或更低版本上运行代码.

  • 这对我来说绝对不是一个问题. (4认同)

Coo*_*ans 14

您可以使用apache commons StringUtils isEmpty()或isNotEmpty().

  • @2019,我们仍然需要一个 3rd 方库:叹息: (2认同)