string.isblank()判断字符串是否为null、空或仅含unicode空白字符,需手动判null防npe;适用于表单校验等语义空判断,不等价于trim().isempty(),且仅java 11+支持。

String.isBlank() 的判断逻辑和适用场景
String.isBlank() 判断的是字符串是否为 null、空("")或仅由空白字符(whitespace)组成。它内部调用 Character.isWhitespace() 逐字符检测,覆盖 Unicode 空白(如 'u2000' 到 'u200F'、'u3000' 等),不只是 ASCII 空格、制表符、换行符。
适合用于表单提交、配置读取、日志清洗等需要“语义上无内容”的判断场景。但要注意:它不等价于 trim().isEmpty()(后者会创建新字符串且不识别部分 Unicode 空白),也不处理 null 安全——isBlank() 本身对 null 抛出 NullPointerException。
必须先判 null,否则直接 NPE
这是最常踩的坑:String.isBlank() 不接受 null,调用时会立即抛出 NullPointerException。JDK 没做 null-safe 封装,你得自己兜底。
- 错误写法:
str.isBlank()(当str == null时崩溃) - 正确写法:
str == null || str.isBlank() - 如果用
Objects.isNull(str) || str.isBlank()也行,但前者更轻量 - Spring 的
StringUtils.hasText()或 Apache Commons 的StringUtils.isBlank()才真正 null-safe,但那是第三方逻辑
对比 trim().isEmpty():性能与语义差异
两者结果在多数 ASCII 场景一致,但行为和开销不同:
-
str.trim().isEmpty()会新建字符串对象(哪怕只含空格),有 GC 开销;isBlank()是只读遍历,无对象分配 -
trim()只删首尾空白,中间有空格仍返回false;而isBlank()要求**全部字符**都是空白才返回true -
trim()对 Unicode 空白支持有限(例如不删中文全角空格'u3000'),isBlank()支持完整 Unicode 空白集 - 示例:
" ".isBlank()(全角空格)→true;" ".trim().isEmpty()→false
Java 版本兼容性与替代方案
String.isBlank() 是 Java 11 引入的方法,低于 Java 11 的项目无法使用。若需兼容旧版本:
- 手动实现(推荐):
str == null || str.length() == 0 || str.chars().allMatch(Character::isWhitespace)(Java 8+,语义等价) - 避免用
str.replaceAll("\s+", "").isEmpty():正则开销大,且\s在不同 JDK 版本中匹配范围可能不一致 - 注意 Android:API 26+(Android 8.0)才支持
isBlank(),低版本需降级处理
真正容易被忽略的是:它不处理“不可见控制字符”(如 'u200B' 零宽空格),这类字符不属于 Character.isWhitespace() 范围,isBlank() 会返回 false,但人眼完全看不出区别——这种 case 得靠额外规则清理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











