【问题标题】:Difference between String.isEmpty() and String.equals("")String.isEmpty() 和 String.equals("") 的区别
【发布时间】:2011-07-26 10:03:04
【问题描述】:

我创建了一个“颜色选择器”,其中包含用户定义 rgb 值的三个文本框。
要检查输入的值是否正确(仅 0-255 之间的数字),我使用以下内容:

public Color getColor() {
    if (tfRed.getText().equals("") || tfGreen.getText().equals("") || tfBlue.getText().equals("")) {
                return new Color(0, 0, 0, 0);
    } else {
        if (tfRed.getText().matches("\\d+") && tfGreen.getText().matches("\\d+") && tfBlue.getText().matches("\\d+")) {
            // ...
        } else {
            return new Color(0, 0, 0, 0);
        }
    }
}

我要问的是:使用String.isEmpty() 更好吗?我从来没有找到令人满意的答案,我一直想知道是否有任何区别。

【问题讨论】:

标签: java string


【解决方案1】:

我认为isEmpty() 效率更高一些。但是,无论如何,智能编译器可能会优化 equals("") 调用。来自OpenJDK source

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

 1013     public boolean equals(Object anObject) {
 1014         if (this == anObject) {
 1015             return true;
 1016         }
 1017         if (anObject instanceof String) {
 1018             String anotherString = (String)anObject;
 1019             int n = count;
 1020             if (n == anotherString.count) {
 1021                 char v1[] = value;
 1022                 char v2[] = anotherString.value;
 1023                 int i = offset;
 1024                 int j = anotherString.offset;
 1025                 while (n-- != 0) {
 1026                     if (v1[i++] != v2[j++])
 1027                         return false;
 1028                 }
 1029                 return true;
 1030             }
 1031         }
 1032         return false;
 1033     }

关于是否使用str.isEmpty()"".equals(str)answer here 也很明确:

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

【讨论】:

    【解决方案2】:

    是的,使用String.isEmpty()。它更干净(语义上)(性能也稍微好一点,但这不会引起注意)如果实例可以为空,请使用 commons-lang StringUtils.isEmpty(string)

    【讨论】:

      【解决方案3】:

      由于isEmpty() 检查String 的长度是否为0 并且""唯一 String 长度为0,每个String isEmpty() 返回@ 987654327@ 也会将true 返回到.equals("")。所以从技术上讲,他们做同样的事情

      性能上的差异可能很小,但我根本不会为此烦恼(如果它在生产代码中很明显,我会感到非常惊讶)。

      另一个区别是如果你写了"".equals(someString),那么它将是“null-safe”。换句话说:如果someStringnull,则此构造将简单地计算为false 而不会抛出NullPointerException。但是,如果您有 someString.equals(""),那么这适用。

      最重要的区别在于它的阅读方式:isEmpty() 明确了意图非常:您希望以不同的方式处理空字符串。 .equals("") 稍微less 清晰(“如果那个字符串等于另一个字符串,那恰好是空的”)。

      【讨论】:

      • 除了上述答案之外,String.equals("") 比仅调用 isEmpty() 慢一点。字符串存储在构造函数中初始化的计数变量,因为字符串是不可变的。 isEmpty() 将 count 变量与 0 进行比较,而 equals 将检查类型、字符串长度,然后在大小匹配时遍历字符串进行比较。 isEmpty() 实际上会少很多!这是一件好事。
      • 是的,我正在搜索这个“”.isEquals(someString) 或“”.isEqualsIgnoreCase(someString) 不会抛出 NullPointerException。谢谢!
      【解决方案4】:

      通常,我喜欢使用 equals 但反过来,即:

      "".equals(someString);
      

      空安全:)

      但是,是的,isEmpty() 是一个更简单的操作,但我认为它对性能的贡献并不大(除非您正在编写嵌入式实时内容)。

      【讨论】:

        【解决方案5】:

        使用myString.equals(""),首先编译器创建一个String对象(相当于myString.equals(new String(""))

        所以,isEmpty() 应该是更好的选择(虽然 equals("") 很流行)。

        【讨论】:

        • 字符串字面量通常在类加载时加载,并且几乎可以保证 "" 已经存在。
        • @Peter Lawrey “加载”是什么意思。单身人士?
        • 它不等同于new String("")"" 已被实习并已存在于字符串池中。
        【解决方案6】:

        理论上是这样的。对于isEmpty(),只需要查看字符串的内部元数据(例如,它的长度)。为了进行比较,您预计会发生更多的案例差异。

        在实践中,这并不重要。你不会观察到速度差异。

        重击规则:使用程序员最容易理解/最易读的方法。如果是对空字符串的测试,我认为isEmpty() 最适合这个目的。

        【讨论】:

          【解决方案7】:

          isEmpty() 更快,因为它只将String 类中的length 整数字段与0 进行比较,而与空字符串进行比较最多会比较引用(类似的速度),最坏的情况是 - 运行循环0 次迭代。

          但最大的区别在于可读性——isEmpty() 更短更容易掌握。顺便说一句,我希望有一个 isBlank() 简写为 .trim().isEmpty()...

          【讨论】:

            【解决方案8】:

            使用myString.equals("")myString.length() == 0 的另一个原因是Java 1.6 中引入了String#isEmpty() 方法。

            因此,不使用 String#isEmpty() 的参数可能是与 Java 以前版本的兼容性原因。

            【讨论】:

              【解决方案9】:

              这部分是历史和遗留用途的问题。 isEmpty() 仅在 JDK 6 中添加:

              /**
               * Returns <tt>true</tt> if, and only if, {@link #length()} is <tt>0</tt>.
               *
               * @return <tt>true</tt> if {@link #length()} is <tt>0</tt>, otherwise
               * <tt>false</tt>
               *
               * @since 1.6
               */
              public boolean isEmpty() {
              

              在此之前,大家都和""比较,看一个String是否为空。旧习惯很难改掉,所以很多人继续使用"" 比较。

              当然,正如其他人已经提到的,如果您使用"".equals(someString),那么它会自动为空安全。许多人通过创建static isEmpty method 将 isEmpty 的想法与 null 安全性结合起来。

              【讨论】:

              • “在此之前,每个人都用“”来比较一个字符串是否为空。” - 不是每个人。有人用length() == 0
              【解决方案10】:

              isEmpty 仅在 1.6 中引入。检查javadoc中的Since标签。

              因此,如果您正在为 1.5 及更低版本进行编译,equals("") 是您唯一的选择。

              但是,如果您不关心版本兼容性,我会使用isEmpty。正如 Bozho 指出的那样,它在语义上更清晰(而且速度更快)。

              【讨论】:

                【解决方案11】:

                我一直使用 .isEmpty()... 直到今天,我发现它在 Java 5 中不存在。

                所以:

                • 在 Java 6 及更新版本中,我们有选择权,我建议使用 .isEmpty(),它更易于编写且阅读更清晰。
                • 在 Java 5 及更早版本中,我们必须使用 .equals("")

                【讨论】:

                  【解决方案12】:

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

                  isEmpty() 将 count 变量与 0 进行比较,而 equals 将检查类型、字符串长度,然后在大小匹配时遍历字符串进行比较。

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

                  【讨论】:

                    猜你喜欢
                    • 2022-12-11
                    • 1970-01-01
                    • 2014-06-18
                    • 1970-01-01
                    • 2014-04-18
                    • 1970-01-01
                    • 2020-07-16
                    • 2021-11-04
                    • 1970-01-01
                    相关资源
                    最近更新 更多