时间:2011-07-26 10:03:05

标签: java string

我创建了一个“Color Chooser”,其中包含三个文本框,用户可以在其中定义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()更好吗?我从来没有找到令人满意的答案,我一直想知道是否有任何不同。

12 个答案:

答案 0 :(得分:26)

我认为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)的{​​{3}}也适用于:

  

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

答案 1 :(得分:12)

是的,请使用String.isEmpty()。它更干净(语义上)(性能也略好一些,但这是不可察觉的)如果实例可以为null,请使用commons-lang StringUtils.isEmpty(string)

答案 2 :(得分:6)

由于isEmpty()检查String的长度是否为0而"" String,长度为0,每个{{} 1}} String返回isEmpty()也会将true返回true。从技术上讲,他们做同样的事情

性能上可能存在微小差异,但我根本不会理会这一点(如果在生产代码中引人注意,我会感到非常惊讶)。

另一个区别是如果你写了.equals(""),那么它将是“"".equals(someString) - 安全”。换句话说:如果nullsomeString,则此构造只会评估为null而不会抛出false。但是,如果您有NullPointerException,则 不适用

最重要的区别在于如何阅读:someString.equals("")使意图非常明确:您希望以不同方式处理空字符串。 isEmpty()有点清除(“如果该字符串等于其他字符串,则恰好为空”)。

答案 3 :(得分:5)

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

"".equals(someString);

无效安全:)

但是,是的,isEmpty()是一个更简单的操作,但不是那么多,我认为它可以做出任何重要的性能贡献(除非你正在编写嵌入式实时内容)。

答案 4 :(得分:4)

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

所以,isEmpty()应该是一个更好的选择(虽然equals(“”)非常受欢迎)。

答案 5 :(得分:4)

从理论上讲,它是。对于isEmpty(),只需要查看字符串的内部元数据(例如,它的长度)。为了进行比较,您可能会发现稍有不同的案例差异。

在实践中,没关系。你不会观察速度差异。

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

答案 6 :(得分:4)

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

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

答案 7 :(得分:4)

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

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

答案 8 :(得分:3)

这部分是历史和遗产用途的问题。 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安全性的想法。

答案 9 :(得分:2)

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

因此,如果您正在编译1.5和更低equals("")是您唯一的选择。

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

答案 10 :(得分:0)

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

所以:

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

答案 11 :(得分:0)

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

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

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