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)

但在大多数应用中,这种性能差异可以忽略不计。

最佳实践建议

  1. 表单验证和用户输入:优先使用 isBlank()
  2. 密码处理:使用 isEmpty()(因为空格可能是密码的一部分)
  3. 配置值检查:使用 isBlank() 忽略空白配置
  4. 数据库字段:根据业务决定,通常用 isBlank()
  5. API参数:使用 isBlank() 提供更好的用户体验

总结表格

场景 推荐使用 原因
用户名/昵称输入 isBlank() 空白用户名无意义
密码输入 isEmpty() 空格可能是密码的一部分
搜索关键词 isBlank() 空白搜索无意义
必填字段验证 isBlank() 更好的用户体验
可选字段 isEmpty() 或 isBlank() 根据业务需求
字符串处理前检查 isBlank() 通常需要trim()

简单记忆

  • isEmpty():只关心"有没有字符"
  • isBlank():关心"有没有实际内容"(忽略空白)
posted @ 2026-01-04 16:10  槑孒  阅读(48)  评论(0)    收藏  举报