Java String.isEmpty()和String.equals(";)之间的差异

Java String.isEmpty()和String.equals(";)之间的差异,java,string,Java,String,我创建了一个带有三个文本框的“颜色选择器”,用户在其中定义rgb值。 要检查输入的值是否正确(仅限0-255之间的数字),我使用以下方法: public Color getColor() { if (tfRed.getText().equals("") || tfGreen.getText().equals("") || tfBlue.getText().equals("")) { return new Color(0, 0, 0, 0); } e

我创建了一个带有三个文本框的“颜色选择器”,用户在其中定义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()
是否更好?我从来没有找到一个令人满意的答案,我一直想知道是否有什么不同

我认为
isEmpty()
更有效率。但是,智能编译器可能会优化
equals(“”)
调用。从:

另外,关于是使用
str.isEmpty()
还是使用
”.equals(str)
的问题也在以下位置:

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


是,使用
String.isEmpty()
。如果实例可以为null,则使用commons lang
StringUtils.isEmpty(string)
myString.equals(“”
)一起使用
myString.equals(“”),编译器首先创建一个string对象(它相当于
myString.equals(新字符串(“”)

因此,isEmpty()应该是一个更好的选择(尽管equals(“”)非常流行)。

因为
isEmpty()
检查
字符串的长度是否为0,
是唯一长度为0的
字符串,每个
isEmpty()
返回
true
也将
true
返回到
.equals(“”
)。因此,从技术上讲,它们做同样的事情

在性能上可能会有微小的差异,但我根本不会为此烦恼(如果在生产代码中它是显而易见的,我会非常惊讶)

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


最重要的区别是它的读取方式:
isEmpty()
的意图非常明确:您希望以不同的方式对待空字符串。
.equals(“”
)更不清晰(“如果该字符串等于另一个字符串,那正好是空的”)。

理论上是这样的。
isEmpty()
,只需查看字符串的内部元数据(例如,它的长度)。对于比较,您可能会看到更多的案例差异

实际上,这并不重要。你不会观察到速度差

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

isEmpty()
速度更快,因为它只将
字符串
类中的
长度
整数字段与
0
进行比较,而与空字符串进行比较,充其量只能比较引用(速度类似),最坏的情况下——以0次迭代运行循环


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

通常,我喜欢使用相等,但相反,即:

"".equals(someString);
空安全:)


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

isEmpty仅在1.6中引入。签入自标记

因此,如果您是为1.5及更低版本编译,那么
equals(“”
是您唯一的选择


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

这在一定程度上是历史和遗留用途的问题
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() {
/**
*当且仅当{@link#length()}为0时返回true。
*
*@如果{@link#length()}为0,则返回true,否则返回
*假的
*
*@自1.6
*/
公共布尔值为空(){
在此之前,每个人都会比较
,看看字符串是否为空。旧习惯很难改掉,所以很多人一直在使用
比较


当然,正如其他人已经提到的,如果你使用
“”.equals(someString)
,那么它自动是空安全的。许多人将isEmpty的概念与空安全性结合在一起,通过使用
myString.equals(“”)
myString.length()==0
是不是
字符串#isEmpty()
方法是在Java 1.6中引入的


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

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

因此:

  • 在Java6和更新版本中,我们可以选择,我建议使用
    .isEmpty()
    ,这样更易于编写,更易于阅读
  • 在Java5及更早版本中,我们必须使用
    .equals(“”
String.equals(“”)比isEmpty()调用慢一点。字符串存储在构造函数中初始化的计数变量,因为字符串是不可变的

isEmpty()将count变量与0进行比较,而equals将检查类型、字符串长度,然后迭代ove
/**
 * 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() {