String.isEmpty()仅判断长度是否为0,不处理空白字符;StringUtils.isBlank()和Java 11+的isBlank()才真正识别视觉为空的字符串,且对null安全。

String.isEmpty() 只看长度,不处理空白字符
isEmpty() 是 String 自带的方法,它只判断字符串长度是否为 0。哪怕里面全是空格、制表符或换行符,只要长度不为 0,它就返回 false。
常见错误现象:用户输入了几个空格后点提交,isEmpty() 检查通过,结果后端解析失败或入库脏数据。
- 适用场景:你明确只要“零长度”才算空,比如校验 UUID 字段是否被截断、API 返回的 token 是否缺失
- 不适用场景:表单文本框、用户昵称、地址等允许含空格但不应全为空白的字段
- 性能上无负担,是原生方法,比任何工具类都快
StringUtils.isBlank() 才真正过滤“视觉上为空”的字符串
这是 Apache Commons Lang 库里的 StringUtils.isBlank(),它会先判空(null),再用 trim().length() == 0 判断——也就是把首尾空白去掉后看是否还剩内容。
典型错误现象:没引入 commons-lang3 却直接写 StringUtils.isBlank(),编译报错 Cannot resolve symbol 'StringUtils';或者用了旧版 commons-lang(2.x),导致 isBlank() 对 Unicode 空白字符(如 )支持不全。
立即学习“Java免费学习笔记(深入)”;
- 必须添加依赖:
org.apache.commons:commons-lang3:3.12.0(推荐 3.12+) - 注意:它对
null安全,传入null直接返回true,不用额外判空 - 和
trim().isEmpty()行为一致,但更简洁、可读性高,且避免重复创建String对象
Java 11+ 可用 strip() 替代 trim() 做更准的空白判断
Java 11 引入了 strip()、isBlank() 这两个新方法,它们基于 Unicode 标准识别更多空白字符(比如全角空格、零宽空格),比老式 trim() 更可靠。
容易踩的坑:在 Java 8 项目里误用 " ".isBlank()(含全角空格),编译直接失败;或以为 strip() 和 trim() 完全等价,其实前者能处理更多 Unicode 空白。
-
"\u3000".isBlank()→true(全角空格,trim()不认) -
"\u2000".isBlank()→true(EN QUAD,trim()也不认) - 如果项目已升到 Java 11+,优先用
str == null || str.isBlank(),无需额外依赖
别混用 null 安全和非 null 安全逻辑
最常被忽略的一点:自己写的判空逻辑如果没处理 null,又和 isBlank() 混着用,很容易出 NullPointerException。
比如有人写 if (s.trim().isEmpty()),当 s 是 null 时直接崩;而 StringUtils.isBlank(s) 或 s == null || s.isBlank() 都能兜住。
- 永远先确认变量是否可能为
null,再选方法 - 团队统一规范:内部服务间传参约定非空?还是每个入口都强制 null 安全?这个边界不划清,
isEmpty和isBlank就会用得乱 - IDE 提示
Method invocation 'xxx' may produce 'NullPointerException'别点忽略










