我创建了一个“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()
更好吗?我从来没有找到令人满意的答案,我一直想知道是否有任何不同。
答案 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)
- 安全”。换句话说:如果null
为someString
,则此构造只会评估为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中不存在时。
所以:
.isEmpty()
,它更容易编写和更清晰阅读。.equals("")
。答案 11 :(得分:0)
String.equals(“”)比isEmpty()调用慢一点。字符串存储在构造函数中初始化的计数变量,因为字符串是不可变的。
isEmpty()将count变量与0进行比较,而equals将检查类型,字符串长度,然后迭代字符串以进行比较(如果大小匹配)。
所以要回答你的问题,isEmpty()实际上会少做很多!这是一件好事。