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,因为用户输入可能用多个空白符。所以我们要灵活使用。