StringUtils.isEmpty 与 StringUtils.isBlank 的区别详解
在 Java 开发中,Apache Commons Lang 库中的 StringUtils.isEmpty() 和 StringUtils.isBlank() 是处理字符串判空的常用方法,但它们有重要区别。
核心区别
| 方法 | 判断条件 |
|---|---|
StringUtils.isEmpty() |
检查字符串是否为 null 或长度为 0 (空字符串 "") |
StringUtils.isBlank() |
检查字符串是否为 null、空字符串 ("") 或仅包含空白字符 (空格、制表符等) |
使用示例
import org.apache.commons.lang3.StringUtils;
public class StringUtilsDemo {
public static void main(String[] args) {
// 测试 isEmpty()
System.out.println("isEmpty(null): " + StringUtils.isEmpty(null)); // true
System.out.println("isEmpty(\"\"): " + StringUtils.isEmpty("")); // true
System.out.println("isEmpty(\" \"): " + StringUtils.isEmpty(" ")); // false
System.out.println("isEmpty(\"\\t\"): " + StringUtils.isEmpty("\t")); // false
System.out.println("isEmpty(\"text\"): " + StringUtils.isEmpty("text")); // false
// 测试 isBlank()
System.out.println("\nisBlank(null): " + StringUtils.isBlank(null)); // true
System.out.println("isBlank(\"\"): " + StringUtils.isBlank("")); // true
System.out.println("isBlank(\" \"): " + StringUtils.isBlank(" ")); // true
System.out.println("isBlank(\"\\t\"): " + StringUtils.isBlank("\t")); // true
System.out.println("isBlank(\"\\n\"): " + StringUtils.isBlank("\n")); // true
System.out.println("isBlank(\"text\"): " + StringUtils.isBlank("text")); // false
System.out.println("isBlank(\" text \"): " + StringUtils.isBlank(" text ")); // false
}
}
使用注意事项
-
空指针安全性
- 两个方法都安全处理 null 值,不会抛出 NullPointerException
- 这是它们比 Java 原生方法
str.isEmpty()更安全的地方
-
空白字符的定义
isBlank()将以下字符视为空白:- 空格 (
' ') - 制表符 (
'\t') - 换行符 (
'\n') - 回车符 (
'\r') - Unicode 空白字符 (如全角空格
'\u3000')
- 空格 (
-
性能考虑
isEmpty()性能更高,只需检查长度isBlank()需要遍历字符串检查每个字符是否为空白- 在需要高性能的场景中,优先使用
isEmpty()
-
使用场景
-
使用
isEmpty()当:- 需要检查字符串是否未被初始化 (null)
- 需要检查字符串是否为空字符串 ("")
- 处理标识符、代码值等不允许空白但允许空值的场景
-
使用
isBlank()当:- 验证用户输入(表单字段、API参数等)
- 处理文本内容(忽略纯空白内容)
- 清理和预处理字符串数据
-
替代原生方法比较
// 原生Java实现类似isEmpty()
boolean nativeIsEmpty = str == null || str.isEmpty();
// 原生Java实现类似isBlank()
boolean nativeIsBlank = str == null || str.trim().isEmpty();
但原生实现有以下问题:
str.isEmpty()在 str 为 null 时会抛出 NPEstr.trim()会创建新字符串,有性能开销trim()只能去除 ASCII 空白字符,无法处理所有 Unicode 空白字符
最佳实践
-
用户输入验证:总是使用
isBlank()if (StringUtils.isBlank(username)) { throw new IllegalArgumentException("用户名不能为空"); } -
API 响应处理:根据业务需求选择
// 空字符串视为有效值 if (StringUtils.isEmpty(apiKey)) { // 处理缺失API密钥 } // 空白字符串视为无效 if (StringUtils.isBlank(apiKey)) { // 处理无效API密钥 } -
数据清洗:结合使用
String cleanInput = StringUtils.isBlank(rawInput) ? null : rawInput.trim(); -
配置项处理:使用
isEmpty()保留空白配置// 保留空白字符串作为有效配置 if (!StringUtils.isEmpty(configValue)) { applyConfig(configValue); }
总结
| 特性 | isEmpty() |
isBlank() |
|---|---|---|
| null | true | true |
| "" | true | true |
| " " | false | true |
| "\t" | false | true |
| "text" | false | false |
| 性能 | 高 (O(1)) | 中 (O(n)) |
| 主要用途 | 检查空值或空字符串 | 检查空值、空字符串或空白 |
在实际开发中,根据具体需求选择合适的方法,通常用户输入验证优先使用 isBlank(),而配置处理或标识符检查更适合使用 isEmpty()。

浙公网安备 33010602011771号