乐趣区

关于java:你不得不知的一个开发常识

关注“Java 后端技术全栈”

回复“面试”获取全套面试材料

在我的项目中,咱们基本上都会有个 StringUtils 工具类,用来解决字符串相干的操作,比方:判空,长度,脱敏等。

明天有个小伙伴,因为调用他人提供的接口,接口里返回参数中有个 String 类型的。

小伙伴判空应用的是 isEmpty() 办法(大多数人认为这个形式没问题)。

然而问题来了:

接口返回的 String 类型参数不是空字符串,是个 " " 这样的字符串。

这个 isEmpty 办法竟然返回成了false,那就是没问题了,校验通过了,而后入库了。于是前面的业务逻辑就乱了,接着整条业务线都被坑惨了!他的年终奖也就这么凉凉了~

其实咱们在我的项目中解决形式个别有两种:

一种是自定义工具类,这个咱们就不扯了。另外一种是应用第三方的工具类,比方:

commons-lang3

org.apache.commons.lang3.StringUtils

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

spring-core 中

org.springframework.util.StringUtils

// 判断是否为空
public static boolean isEmpty(Object str) {return (str == null || "".equals(str));
}
// 判断是否由内容
public static boolean hasText(String str) {return (str != null && str.length() > 0 && containsText(str));
}

剖析

下面两个第三方工具类的中 isEmpty() 办法判断是否为空,然而会有问题:如果其中存在 " " 这种字符串的时候,空白字符串是会认为不是空(业务代码中基本上都会把空白字符串解决成空,除非有十分非凡状况)。

isBlank()判断是否为空,解决了 " " 这种场景。所以如果我的项目中应用的是 org.apache.commons.lang3.StringUtils 时,倡议应用 isBlank()办法

hasText()办法是判断是否存在内容,也解决了 " " 这种字符串,然而须要留神 hasText()办法的返回值和 isBlank() 办法返回值是相同的。

示例

应用 isEmpty() 办法和 isBlank() 办法:

import org.apache.commons.lang3.StringUtils;
public class StringUtilDemo {public static void main(String[] args) {
        String name = "";
        String name0 = " ";
        System.out.println(StringUtils.isEmpty(name));
        System.out.println(StringUtils.isEmpty(name0));
        System.out.println(StringUtils.isBlank(name));
        System.out.println(StringUtils.isBlank(name0));
    }
}

输入:

true
false
true
true

空白字符串就认为不是空了,然而往往咱们在业务代码处理过程中,也须要把空白字符串当做是空来解决,所以在应用的时候回留点心。

然而 isBlank() 办法却防止了这种空白字符串的问题。

应用 isEmpty() 办法和 hasText() 办法:

import org.springframework.util.StringUtils;
public class StringUtilDemo {public static void main(String[] args) {
        String name = "";
        String name0 = " ";
        System.out.println(StringUtils.isEmpty(name));
        System.out.println(StringUtils.isEmpty(name0));
        System.out.println(StringUtils.hasText(name));
        System.out.println(StringUtils.hasText(name0));
    }
}

输入:

true
false
false
false

isEmpty()办法也会把空白字符串当做不是空字符串。然而 hasText() 办法却能防止空白字符串的问题。

总结

永远不要指望他人返回来的字符串相对没有空白字符串。

不是不举荐应用 isEmpty(),而是看你的业务代码里是否把空白字符串当做空字符串来解决。

如果空白字符串是依照空字符串查来解决,那么举荐应用 isBlank()办法或者 hasText()办法。

举荐浏览

《程序员面试宝典》.pdf

JVM 真香系列:轻松了解 class 文件到虚拟机(上)

退出移动版