StringUtils里的isEmpty方法和isBlank方法的区别

最近在公司写业务代码,导师提了这个问题,之前学习过程中都是拿来主义,并没有深究,导师的提醒让我知道,作为资深开发工程师,还是要知其然知其所以然比较好,这样能力才有所提高,接下来就来探讨两者区别:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

StringUtils提供了许多的方法,可以通过StringUtils.xxx 看到,如下。
图片说明

直观感受两者区别:

public class StringUtilsTest {

public static void main(String[] args) {
    System.out.println(StringUtils.isEmpty(null));   //结果 true
    System.out.println(StringUtils.isEmpty(""));     //结果true
    System.out.println(StringUtils.isEmpty("  "));   //结果false
    System.out.println(StringUtils.isEmpty("aaa"));  //结果false

    StringUtils.
    System.out.println("===============================");
    System.out.println(StringUtils.isBlank(null));  //结果是true
    System.out.println(StringUtils.isBlank(""));    //结果是true
    System.out.println(StringUtils.isBlank("  "));  //结果是true
    System.out.println(StringUtils.isBlank("aaa")); //结果是false
}

}
图片说明

源码分析:

isEmpty()

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

isBlank()

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;
        }
    }

结论

通过以上代码对比我们可以看出:

1.isEmpty 没有忽略空格参数,是以是否为空和是否存在为判断依据。


2.isBlank 是在 isEmpty 的基础上进行了为空(字符串都为空格、制表符、tab 的情况)的判断。(一般更为常用)

PS:最近在阅读学习公司项目的过程中,发现很多地方要做判空操作的,然后有时候可能调用链比较长,如果用 if else 来判空的话,光判空代码就会比较多,这样对后期维护性不好,而且我们自己判空可能会没有考虑某个场景,这样就会导致可能空指针。我现在强烈推荐大家使用第三方 jar 的工具类去做判空。比如:从 Map 中取一个 key 的值,可以用 MapUtils 这个类;对字符串判空使用 StringUtils 这个类;对集合进行判空使用 CollectionUtils 等等。这些类都可以通过引入 apache 的 commons 包系列使用。
另外补充师傅的原话,两者并不是谁比谁好,是要看各自的应用场景的。比如说:isEmpty使用场景,在我们从数据库中查询结果之后,判断是否为null,那用isEmpty即可;但是在与前端进行对接,前端传来的参数,我们尽量需要用isBlank,因为用户输入可能用多个空白符。所以我们要灵活使用。