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

mas*_*taH 20 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*win 26

我认为isEmpty()效率更高一点.但是,智能编译器equals("")无论如何都可以优化呼叫.来自OpenJDK源:

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

关于是否使用或是现场的答案:str.isEmpty()"".equals(str)

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


Boz*_*zho 13

是的,使用String.isEmpty().它更干净(语义上)(性能稍微好一点,但这是不可察觉的)如果实例可以为null,请使用commons-langStringUtils.isEmpty(string)


Joa*_*uer 6

因为isEmpty()检查的长度String为0,并且""唯一的 String长度为0,每次String针对isEmpty()返回true也将返回true.equals("").从技术上讲,他们做同样的事情.

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

另一个区别是,如果你写了"".equals(someString),那么它将是" null-safe".换句话说:如果someString是的话null,这个结构只会评估false而不是抛出一个NullPointerException.但是,如果你有,someString.equals("")那么这将适用.

最重要的区别是它如何阅读:isEmpty()让意图非常要区别对待空字符串:清晰..equals("")不是那么清晰("如果该字符串等于其他字符串,恰好是空的").


pap*_*pap 5

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

"".equals(someString);
Run Code Online (Sandbox Code Playgroud)

无安全:)

但是,isEmpty()是一个更简单的操作,但不是那么多,我认为它做出了任何重要的性能贡献(除非你编写嵌入式实时的东西).