Java String.isEmpty()和String.equals(";)之间的差异
我创建了一个带有三个文本框的“颜色选择器”,用户在其中定义rgb值。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
要检查输入的值是否正确(仅限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 langStringUtils.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() {