java中字符串不为空_在Java中检查非空,而不是空白的字符串

我试图检查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的综合解释 . 谢了哥们 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值