string.isempty()仅判断长度是否为0,对null抛异常;stringutils.isblank()则统一处理null和全空白字符,语义更准、更安全。

String.isEmpty() 只看长度,不处理空白字符
isEmpty() 是 String 自带的方法,它只检查字符串长度是否为 0。哪怕字符串里全是空格、制表符或换行符,只要长度不为 0,它就返回 false。
常见错误现象:
用户用 isEmpty() 判断用户输入的“ ”(纯空格)是否为空,结果得到 false,导致后续逻辑出错。
- 适用场景:确认字符串是否真的“一个字符都没有”,比如校验 JSON 字段是否缺失(
null需单独判断) - 注意:
isEmpty()对null会抛出NullPointerException - 性能好,无额外开销,因为它只是调用
length() == 0
StringUtils.isBlank() 才真正判断“空内容”
这是 Apache Commons Lang 库里的方法,isBlank() 会把纯空白字符(空格、\t、\n、\r 等)也视为空。它等价于:str == null || str.trim().length() == 0,但更安全、更高效。
常见错误现象:
有人自己写 str != null && !str.trim().isEmpty(),看似等效,但对 null 多次判空、trim() 创建新字符串,既啰嗦又低效。
立即学习“Java免费学习笔记(深入)”;
- 使用前需引入依赖:
org.apache.commons:commons-lang3 -
isBlank()对null安全,直接返回true - 它识别所有 Unicode 空白字符(不只是 ASCII 空格),比手动
trim()更准
为什么不用 String.trim().isEmpty() 替代 isBlank()
看起来差不多,但有三个实际问题:
- 对
null调用trim()会直接抛NullPointerException -
trim()总是新建一个字符串对象,哪怕原字符串已经“干净”,有 GC 开销 -
trim()只去掉首尾空白,中间有连续空格不影响结果;而isBlank()关注的是“整体是否可视为无意义”,语义更清晰
示例对比:" \t\n\r " → trim().isEmpty() 是 true,isBlank() 也是 true;"a " → 前者是 false,后者也是 false;但 null 下前者崩,后者稳。
别漏掉 null 判断这个关键分支
Java 里字符串空值(null)和空字符串("")是两回事。任何只依赖 isEmpty() 或 trim() 的逻辑,一旦遇到 null,基本就挂。
- 如果不用 Commons Lang,最简兜底写法是:
str == null || str.length() == 0(对应空)或str == null || str.trim().length() == 0(对应空白) - 但手写容易漏,尤其在嵌套条件或流式调用中(比如
list.stream().filter(s -> s.isEmpty())) -
isBlank()的价值不在“多厉害”,而在把null和空白的统一判断收敛成一个可读、可测、可复用的原子操作
真正容易被忽略的,不是哪个方法“更好”,而是——你是否在每个字符串判空的地方,都明确想清楚了:这里允许 null 吗?空白算不算“空”?










