我试图检查Java字符串是不是 null ,不是空的而不是空格 .
在我看来,这段代码应该完全适合这项工作 .
public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}
返回字符串的副本,省略前导和尾随空格 . 如果此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;
}
根据Java确定指定的字符是否为空格 . 当且仅当它满足以下条件之一时,字符才是Java空白字符:它是Unicode空格字符(SPACE_SEPARATOR,LINE_SEPARATOR或PARAGRAPH_SEPARATOR),但也不是不间断的空格('\ u00A0','\ u2007','\ u202F') . 这是'\ t',U 0009 HORIZONTAL TABULATION . 这是'\ n',U 000A LINE FEED . 这是'\ u000B',U 000B VERTICAL TABULATION . 这是'\ f',U 000C FORM FEED . 这是'\ r',U 000D CARRIAGE RETURN . 它是'\ u001C',U 001C FILE SEPARATOR . 它是'\ u001D',U 001D GROUP SEPARATOR . 这是'\ u001E',U 001E RECORD SEPARATOR . 这是'\ u001F',U 001F UNIT SEPARATOR .
如果我没有弄错 - 或者可能是我只是没有正确阅读 - 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 . 谢谢@Dukeling .
选择标准 isBlank() 的性能相关原因 . 谢谢@devconsole .
@nhahtdh的综合解释 . 谢了哥们 .