StringUtils.isEmpty()和isBlank()的区别

梦想与她 提交于 2020-08-19 20:56:04

一、概述

两种判断字符串是否为空的用法都是在程序开发时常用的,相信不少同学在这种简单的问题上也吃过亏,到底有什么区别,使用有什么讲究,带着问题往下看。

二、jar包

commons-lang3-3.5.jar

三、isEmpty详解

3.1 源码

public static boolean isEmpty(CharSequence cs) {
    return cs == null || cs.length() == 0;
}

此时发现isEmpty参数是“CharSequence”类型,按之前正常的使用,再看String类的实现:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence{
    ... ...
}

String类实现了CharSequence接口,所以,正常使用时,我们只需要放字符串即可。

再回顾isEmpty源码,很简单,为null或长度为0即判定为Empty。

3.2 示例

public static void main(String[] args){
    StringUtils.isEmpty(null); //true
    StringUtils.isEmpty(""); //true
    StringUtils.isEmpty(" "); //false
    StringUtils.isEmpty("   "); //false
    StringUtils.isEmpty("a"); //false
    StringUtils.isEmpty(" abc "); //false
    StringUtils.isEmpty(" \t \n \u000B \f \r \u001C \u001D \u001E \u001F"); //false 
}

通过示例可以看出,空格、制表符也被当成字符来计算长度,若项目中参数传入为空白字符,结果会事与愿违!

四、isBlank详解

4.1 源码

public static boolean isBlank(CharSequence cs) {
    int strLen;
    if(cs != null && (strLen = cs.length()) != 0) {
        for(int i = 0; i < strLen; ++i) {
            if(!Character.isWhitespace(cs.charAt(i))) {
                return false;
            }
        }
        return true;
    } else {
        return true;
    }
}

isBlank也不是很复杂,再看核心源码Character.isWhitespace:

public static boolean isWhitespace(char ch) {
    return isWhitespace((int)ch);
}

public static boolean isWhitespace(int codePoint) {
    //CharacterData.of方法的实现可自行研究!
    return CharacterData.of(codePoint).isWhitespace(codePoint);
}

通过看源码注释,找到满足空白字符的条件:

  • It is a Unicode space character ({SPACE_SEPARATOR},{LINE_SEPARATOR}, or {PARAGRAPH_SEPARATOR})
  • It is \t = \u0009 制表符.
  • It is \n = \u000A 换行符.
  • It is \u000B 垂直制表符.
  • It is \f = \u000C 换页.
  • It is \r = \u000D 回车.
  • It is \u001C 文件分隔符.
  • It is \u001D 分组符.
  • It is \u001E 记录分隔符.
  • It is \u001F 单元分隔符.

4.2 示例:

public static void main(String[] args){
    StringUtils.isBlank(" \t \n \u000B \f \r \u001C \u001D \u001E \u001F");  //true
    StringUtils.isBlank(null);  //true
    StringUtils.isBlank("");  //true
    StringUtils.isBlank(" ");  //true
    StringUtils.isBlank("    ");  //true
    StringUtils.isBlank("abc abc");  //false
}

五、结论

isEmpty方法只做了null和length()=0的简单判断。而isBlank在isEmpty方法的基础上,扩展了对空白字符的判断。因此,可以视isBlank是isEmpty的加强版本。程序开发中可根据场景不同合理选择。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!