isBlank() 方法详解:检查字符串是否为空或仅包含空白字符

方法定义

public static boolean isBlank(CharSequence str) {
    if (str == null || str.length() == 0) {
        return true;
    }
    for (int i = 0; i < str.length(); i++) {
        if (!Character.isWhitespace(str.charAt(i))) {
            return false;
        }
    }
    return true;
}

功能说明

检查字符串是否满足以下任一条件:

  1. null 引用
  2. 空字符串 ("")
  3. 仅包含空白字符(空格、制表符、换行符等 Unicode 空白符)

示例代码

public class StringUtils {
    public static void main(String[] args) {
        System.out.println(isBlank(null));      // true
        System.out.println(isBlank(""));        // true
        System.out.println(isBlank(" "));       // true
        System.out.println(isBlank("\t\n"));    // true
        System.out.println(isBlank("  \u2000")); // true (Unicode空白)
        System.out.println(isBlank("a"));        // false
        System.out.println(isBlank(" a "));      // false
    }
}

使用技巧

  1. 用户输入验证:快速检查表单输入是否有效
    if (StringUtils.isBlank(username)) {
        throw new IllegalArgumentException("用户名不能为空");
    }
    
  2. 数据清洗:跳过空白行处理文本文件
    for (String line : lines) {
        if (!isBlank(line)) process(line);
    }
    
  3. 链式操作:结合 trim() 实现灵活处理
    String cleanInput = isBlank(rawInput) ? null : rawInput.trim();
    

常见错误

  1. 混淆 isEmptyisBlank
    " ".isEmpty();   // false (错误!)
    " ".isBlank();   // true  (正确)
    
  2. 未处理 Unicode 空白符
    错误实现(仅检查空格):
    // 错误!无法检测 \t, \n, \u2000 等
    return str.trim().isEmpty(); 
    
  3. 直接调用 trim() 导致性能浪费
    // 错误!对长字符串先trim()效率低下
    if (str != null && str.trim().isEmpty()) ...
    

注意事项

  1. 空白字符定义:遵循 Unicode 标准(Character.isWhitespace()
    • 包括:空格( )、制表符(\t)、换行(\n)、全角空格(\u3000)等
  2. 空字符串 vs null:两者均视为空白
  3. 不可见字符:零宽空格(\u200B)等不是空白字符
    isBlank("\u200B"); // false (特殊字符需单独处理)
    

最佳实践与性能优化

  1. 优先检查长度:快速过滤非空字符串
    if (str == null || str.length() == 0) return true;
    
  2. 短路遍历:发现非空白字符立即退出
    for (int i = 0; i < str.length(); i++) {
        if (!Character.isWhitespace(str.charAt(i))) {
            return false; // 发现非空白立即返回
        }
    }
    
  3. 避免 trim()trim() 会创建新字符串,直接遍历更高效
  4. 支持 CharSequence:兼容 StringStringBuilder 等类型
  5. Java 11+ 用户:直接使用内置方法
    // Java 11+ 原生支持
    "  ".isBlank(); // true
    

总结

关键点 说明
核心功能 检测 null/空字符串/纯空白字符串
性能关键 优先检查长度 + 短路遍历
isEmpty 区别 isBlank 额外识别空白字符
Java 11+ 直接使用 String.isBlank()
典型应用场景 输入验证、数据清洗、文本预处理

实践建议

✅ 使用 isBlank() 替代 trim().isEmpty() 更高效安全
✅ 处理用户输入时始终优先调用此方法
✅ 注意 Unicode 空白符的特殊性
✅ Java 11+ 项目直接调用原生方法