isEmpty和equals("")之间的区别

3 java string comparison

可能重复:
我应该使用string.isEmpty()还是"".equals(string)?

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

thk*_*ala 8

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

1286       public boolean isEmpty() {
1287           return 0 == count;
1288       }
Run Code Online (Sandbox Code Playgroud)

使用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       }
Run Code Online (Sandbox Code Playgroud)

注意:两个片段都来自此java.lang.String实现.

编辑:

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

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

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

if ("".equals(string)) ...
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 7

结果是一样的,但更喜欢isEmpty():

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

如果字符串也有可能null,你可以检查apache commons-langStringUtils.isEmpty(..)