我正在尝试检查 Java String 是否不是null
,不是空的,也不是空格。
在我看来,这段代码应该很适合这项工作。
public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}
根据文档,String.trim()
应该这样工作:
返回字符串的副本,省略前导和尾随空格。
如果此
String
对象表示一个空字符序列,或者此对象表示的字符序列的首尾字符String
都具有大于'\u0020'
(空格字符)的代码,则返回对该String
对象的引用。
但是,apache/commons/lang/StringUtils.java
它的做法有点不同。
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
根据文档,Character.isWhitespace()
:
根据 Java 确定指定字符是否为空格。一个字符是一个 Java 空白字符当且仅当它满足以下条件之一:
- 它是 Unicode 空格字符(
SPACE_SEPARATOR
、、LINE_SEPARATOR
或PARAGRAPH_SEPARATOR
),但也不是不间断空格('\u00A0'
、、、'\u2007'
)'\u202F'
。- 它是
'\t'
,U+0009 水平制表。- 它是
'\n'
,U+000A LINE FEED。- 它是
'\u000B'
,U+000B 垂直制表。- 它是
'\f'
,U+000C 换页。- 是
'\r'
,U+000D 回车。- 它是
'\u001C'
,U+001C 文件分隔符。- 它是
'\u001D'
,U+001D 组分隔符。- 它是
'\u001E'
,U+001E 记录分隔符。- 它是
'\u001F'
,U+001F 单位分隔符。
如果我没记错 - 或者我可能只是没有正确阅读它 -String.trim()
应该带走任何正在检查的字符Character.isWhiteSpace()
。他们都看到在上面'\u0020'
。
在这种情况下,更简单的isEmpty
功能似乎涵盖了更长的功能涵盖的所有场景isBlank
。
- 是否有一个字符串会使测试用例中的
isEmpty
和行为不同?isBlank
- 假设没有,是否还有其他考虑因素我应该选择
isBlank
而不使用isEmpty
?
对于那些对实际运行测试感兴趣的人,这里是方法和单元测试。
public class StringUtil {
public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
}
和单元测试
@Test
public void test() {
String s = null;
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = "";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s));
s = " ";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = " ";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = " a ";
assertTrue(StringUtil.isEmpty(s)==false) ;
assertTrue(StringUtil.isBlank(s)==false) ;
}
更新:这是一个非常有趣的讨论——这就是我喜欢 Stack Overflow 和这里的人们的原因。顺便说一句,回到问题,我们得到:
- 一个程序,显示哪些所有字符会使行为不同。代码位于https://ideone.com/ELY5Wv。谢谢@杜克林。
- 选择标准的性能相关原因
isBlank()
。谢谢@devconsole。 - @nhahtdh 的全面解释。谢了哥们。