isEmpty和equals(“”)之间的区别

时间:2011-01-30 21:40:09

标签: java string comparison

  

可能重复:
  Should I use string.isEmpty() or “”.equals(string)?

我想知道,isEmpty和equals(“”)之间有什么区别?它们看起来与我自己完全相同。

5 个答案:

答案 0 :(得分:8)

java.lang.String.isEmpty()更快,因为它只是将字符串的长度(存储在String对象中)与零进行比较:

1286       public boolean isEmpty() {
1287           return 0 == count;
1288       }

使用equals("")执行实际的字符串比较 - 虽然JVM可以抵消其部分成本,但它应该更慢。在大多数实现中,它也包括长度检查:

854       public boolean equals(Object object) {
855           if (object == this) {
856               return true;
857           }
858           if (object instanceof String) {
859               String s = (String) object;
860               int hash = hashCode;  // Single read on hashCodes as they may change
861               int shash = s.hashCode;
862               if (count != s.count || (hash != shash && hash != 0 && shash != 0)) {
863                   return false;
864               }
865               for (int i = 0; i < count; ++i) {
866                   if (value[offset + i] != s.value[s.offset + i]) {
867                       return false;
868                   }
869               }
870               return true;
871           }
872           return false;
873       }

注意:两个片段都来自this java.lang.String implementation

编辑:

对于长时间运行的热代码,JVM将在equals("")中计算出优化,并可能会出现接近isEmpty()的内容。但是,对于一次性通话,可能会有一个小的性能差异。最好只使用isEmpty()并保存JVM,使其无法独立完成。

此外,isEmpty()的意图也更清晰,在我看来,从长远来看,稍微容易维护。

请注意,如果字符串对象也可以是null,那么这可能更好:

if ("".equals(string)) ...

答案 1 :(得分:7)

结果相同,但更喜欢isEmpty()

  • equals("")获取一个不同的对象(来自字符串池,因此它不是实例化),然后验证给定的字符串是否等于该字符串
  • isEmpty()只需检查字符串中的符号数(存储在私有字段count中)是否为0.少得多的开销。

如果字符串也可能是null,您可以检查apache commons-lang StringUtils.isEmpty(..)

答案 2 :(得分:1)

在功能上它们是相同的(我的意思是它们会产生相同的结果)。在我看来,isEmpty()更具可读性。当你阅读代码时,它会更加明显。它也更有效率。

答案 3 :(得分:0)

您可以在此类question中找到有关它们之间差异的更多详细信息。

答案 4 :(得分:0)

OpenJDK来源使用isEmpty的{​​{3}}:

public boolean isEmpty() {
    return count == 0;
}

这表明他们会返回相同的结果。请注意equals("")创建一个新的字符串对象,因此它将比上述简单测试慢得多。