isEmpty和isBlank的底层原理和区别
一、Java 原生方法
1. String.isEmpty()
- 底层原理:直接检查字符串的长度是否为0。
- 源码:
return this.value.length == 0;
(this.value
是底层字符数组)。 - 仅判断空字符串(如
""
),不处理空白字符(如" "
、"\t"
)。 - 对
null
调用会抛出NullPointerException
。
- 源码:
2. String.isBlank()
(Java 11+)
- 底层原理:遍历字符串的每个字符,检查是否全为空白字符(包括空格、制表符、换行符等)。
- 源码逻辑:
if (length == 0) return true; for (int i = 0; i < length; i++) {if (!Character.isWhitespace(charAt(i))) return false; } return true;
- 判断条件:空字符串、
null
(抛异常)或全空白字符均返回true
。
- 源码逻辑:
二、Apache Commons Lang 工具类
1. StringUtils.isEmpty()
- 底层原理:检查字符串是否为
null
或空字符串(""
)。- 源码:
return cs == null || cs.length() == 0;
。 - 不处理空白字符(如
" "
会被认为非空)。 - 适用场景:严格判空(如数据库字段非空校验)。
- 源码:
2. StringUtils.isBlank()
- 底层原理:扩展了
isEmpty
,额外检查字符串是否全为空白字符。- 源码逻辑:
if (cs == null || cs.length() == 0) return true; for (int i = 0; i < length; i++) {if (!Character.isWhitespace(cs.charAt(i))) return false; } return true;
- 判断条件:
null
、空字符串或全空白字符均返回true
。 - 适用场景:用户输入校验(如忽略前后空格的表单提交)。
- 源码逻辑:
三、Power Platform 函数
在 Power Apps 或 Power BI 中:
IsBlank
- 检测空白值(
Blank()
)或空字符串(""
)。 - 示例:
IsBlank("")
返回true
,IsBlank(" ")
返回false
(因空格非空白值)。 - 注意:空表需用
IsEmpty
判断。
- 检测空白值(
IsEmpty
- 仅检测表是否为空(无记录)。
四、关键区别总结
方法 | 判断条件 | 对空格的处理 | 对 null 的处理 | 典型场景 |
---|---|---|---|---|
String.isEmpty() | 长度为0 | 忽略 | 抛异常 | 空字符串检查 |
String.isBlank() | 空或全空白字符 | 包含 | 抛异常 | 用户输入验证(Java 11+) |
StringUtils.isEmpty() | null 或空字符串 | 忽略 | 返回 true | 严格判空(如数据库约束) |
StringUtils.isBlank() | null 、空字符串或全空白字符 | 包含 | 返回 true | 宽松判空(如表单提交) |
IsBlank (Power Platform) | 空白值或空字符串 | 仅空字符串 | 返回 true | 数据验证(非空表) |
五、底层实现对比
- 性能差异:
StringUtils.isEmpty()
比原生isEmpty()
更安全(处理null
),但性能略低。isBlank()
需遍历字符,时间复杂度为 O(n),适用于短字符串。
- 工具类优化:
- Apache Commons Lang 的
isBlank
通过提前终止循环(发现非空白字符立即返回)提升效率。
- Apache Commons Lang 的
六、使用建议
Java 原生:
- 优先用
StringUtils.isBlank()
(工具类)处理用户输入,避免空格干扰。 - 若需兼容旧版本,可用
str.isEmpty() || str.trim().isEmpty()
替代。 - Power Platform:
- 用
IsBlank
检测字段是否为Blank
或空字符串,IsEmpty
检测表是否为空。
通过理解底层逻辑,可更精准地选择方法,避免因判空不严格导致的业务逻辑错误。
- 用