我想知道,isEmpty和equals(“”)之间有什么区别?它们看起来与我自己完全相同。
答案 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("")
创建一个新的字符串对象,因此它将比上述简单测试慢得多。