StringUtils.isBlank和StringUtils.isEmpty有什么区别
StringUtils.isBlank() 和 StringUtils.isEmpty() 都是Apache Commons Lang库中的方法,但它们在处理空白字符串时有重要区别。
核心区别总结
| 方法 | 是否检查空字符串 | 是否检查空白字符 | 示例结果 |
|---|---|---|---|
isEmpty() |
是 | 否 | 只看长度是否为0 |
isBlank() |
是 | 是 | 检查是否为空白或空 |
详细对比
1. StringUtils.isEmpty()
// Apache Commons Lang
public static boolean isEmpty(CharSequence cs) {
return cs == null || cs.length() == 0;
}
特点:
- 只检查字符串是否为
null或长度是否为0 - 不检查空白字符(空格、制表符、换行符等)
示例:
StringUtils.isEmpty(null); // true
StringUtils.isEmpty(""); // true
StringUtils.isEmpty(" "); // false (空格有长度)
StringUtils.isEmpty(" "); // false (有多个空格)
StringUtils.isEmpty("\t\n"); // false (有空白字符)
StringUtils.isEmpty("abc"); // false
StringUtils.isEmpty(" abc "); // false
2. StringUtils.isBlank()
// 实际实现会检查所有空白字符
public static boolean isBlank(CharSequence cs) {
int strLen = length(cs);
if (strLen == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
特点:
- 检查字符串是否为
null、空或仅包含空白字符 - 会检查并忽略所有空白字符
示例:
StringUtils.isBlank(null); // true
StringUtils.isBlank(""); // true
StringUtils.isBlank(" "); // true (只有空格)
StringUtils.isBlank(" "); // true (只有多个空格)
StringUtils.isBlank("\t\n\r"); // true (只有空白字符)
StringUtils.isBlank("abc"); // false
StringUtils.isBlank(" abc "); // false (包含非空白字符)
使用场景对比
适合使用 isEmpty() 的场景:
// 场景1:只关心字符串是否有内容,不在乎空白字符
String userInput = " ";
if (StringUtils.isEmpty(userInput)) {
// 这里不会执行,因为userInput不是empty
System.out.println("输入为空");
}
// 场景2:处理必须严格有值的字段
String userId = getUserInput(); // 用户可能输入" "
if (StringUtils.isEmpty(userId)) {
// 用户必须输入字符,空格不算有效输入
throw new ValidationException("用户ID不能为空");
}
// 场景3:处理密码(空格是有效字符)
String password = " ";
if (StringUtils.isEmpty(password)) {
// 这里不会阻止,因为空格被视为有效密码字符
}
适合使用 isBlank() 的场景:
// 场景1:表单验证,忽略空白输入
String username = getUserInput(); // 用户可能输入" "或""
if (StringUtils.isBlank(username)) {
System.out.println("请输入有效的用户名"); // 会执行
}
// 场景2:处理用户输入的文本,忽略空白
String searchKeyword = " ";
if (StringUtils.isBlank(searchKeyword)) {
// 不执行搜索
return;
} else {
// 执行搜索
}
// 场景3:清理和处理用户输入
String comment = getUserComment();
if (StringUtils.isBlank(comment)) {
// 不保存空白评论
return;
}
comment = comment.trim(); // 去除前后空白
Java标准库的等价方法
Java 11+ 的原生方法:
// Java 11+ 引入了类似方法
String str = " ";
// 等价于 StringUtils.isEmpty()
boolean isEmpty = str == null || str.isEmpty(); // false
// 等价于 StringUtils.isBlank()
boolean isBlank = str == null || str.isBlank(); // true
实战示例
示例1:用户注册验证
public class UserValidator {
public ValidationResult validateUser(User user) {
ValidationResult result = new ValidationResult();
// 使用isBlank:用户名不能是空白
if (StringUtils.isBlank(user.getUsername())) {
result.addError("用户名不能为空或空白");
}
// 使用isEmpty:密码不能为空,但空格是有效字符
if (StringUtils.isEmpty(user.getPassword())) {
result.addError("密码不能为空");
}
// 电话号码处理
String phone = user.getPhone();
if (StringUtils.isBlank(phone)) {
result.addError("电话号码不能为空");
} else {
// 去除空白后再验证
phone = phone.trim();
if (!phone.matches("\\d{11}")) {
result.addError("电话号码格式不正确");
}
}
return result;
}
}
示例2:配置文件读取
public class ConfigReader {
public String getConfigValue(String key, String defaultValue) {
String value = readFromConfigFile(key);
// 如果配置值为null、空或空白,使用默认值
if (StringUtils.isBlank(value)) {
return defaultValue;
}
// 去除前后空白
return value.trim();
}
}
示例3:命令行参数处理
public class CommandProcessor {
public void processCommand(String[] args) {
if (args == null || args.length == 0) {
showHelp();
return;
}
String command = args[0];
// 使用isBlank:命令不能是空白
if (StringUtils.isBlank(command)) {
showHelp();
return;
}
command = command.trim().toLowerCase();
switch (command) {
case "start":
startService();
break;
case "stop":
stopService();
break;
default:
System.out.println("未知命令: " + command);
}
}
}
性能考虑
isBlank() 比 isEmpty() 有额外的性能开销,因为它需要遍历字符串检查每个字符:
// 性能对比
String testStr = " "; // 2个空格
// isEmpty(): 快速,只检查长度
boolean empty = StringUtils.isEmpty(testStr); // O(1)
// isBlank(): 较慢,需要遍历字符
boolean blank = StringUtils.isBlank(testStr); // O(n)
但在大多数应用中,这种性能差异可以忽略不计。
最佳实践建议
- 表单验证和用户输入:优先使用
isBlank() - 密码处理:使用
isEmpty()(因为空格可能是密码的一部分) - 配置值检查:使用
isBlank()忽略空白配置 - 数据库字段:根据业务决定,通常用
isBlank() - API参数:使用
isBlank()提供更好的用户体验
总结表格
| 场景 | 推荐使用 | 原因 |
|---|---|---|
| 用户名/昵称输入 | isBlank() | 空白用户名无意义 |
| 密码输入 | isEmpty() | 空格可能是密码的一部分 |
| 搜索关键词 | isBlank() | 空白搜索无意义 |
| 必填字段验证 | isBlank() | 更好的用户体验 |
| 可选字段 | isEmpty() 或 isBlank() | 根据业务需求 |
| 字符串处理前检查 | isBlank() | 通常需要trim() |
简单记忆:
isEmpty():只关心"有没有字符"isBlank():关心"有没有实际内容"(忽略空白)

浙公网安备 33010602011771号