sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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
    }
}

使用注意事项

  1. 空指针安全性

    • 两个方法都安全处理 null 值,不会抛出 NullPointerException
    • 这是它们比 Java 原生方法 str.isEmpty() 更安全的地方
  2. 空白字符的定义

    • isBlank() 将以下字符视为空白:
      • 空格 (' ')
      • 制表符 ('\t')
      • 换行符 ('\n')
      • 回车符 ('\r')
      • Unicode 空白字符 (如全角空格 '\u3000')
  3. 性能考虑

    • isEmpty() 性能更高,只需检查长度
    • isBlank() 需要遍历字符串检查每个字符是否为空白
    • 在需要高性能的场景中,优先使用 isEmpty()
  4. 使用场景

    • 使用 isEmpty() 当:

      • 需要检查字符串是否未被初始化 (null)
      • 需要检查字符串是否为空字符串 ("")
      • 处理标识符、代码值等不允许空白但允许空值的场景
    • 使用 isBlank() 当:

      • 验证用户输入(表单字段、API参数等)
      • 处理文本内容(忽略纯空白内容)
      • 清理和预处理字符串数据

替代原生方法比较

// 原生Java实现类似isEmpty()
boolean nativeIsEmpty = str == null || str.isEmpty();

// 原生Java实现类似isBlank()
boolean nativeIsBlank = str == null || str.trim().isEmpty();

但原生实现有以下问题:

  1. str.isEmpty() 在 str 为 null 时会抛出 NPE
  2. str.trim() 会创建新字符串,有性能开销
  3. trim() 只能去除 ASCII 空白字符,无法处理所有 Unicode 空白字符

最佳实践

  1. 用户输入验证:总是使用 isBlank()

    if (StringUtils.isBlank(username)) {
        throw new IllegalArgumentException("用户名不能为空");
    }
    
  2. API 响应处理:根据业务需求选择

    // 空字符串视为有效值
    if (StringUtils.isEmpty(apiKey)) {
        // 处理缺失API密钥
    }
    
    // 空白字符串视为无效
    if (StringUtils.isBlank(apiKey)) {
        // 处理无效API密钥
    }
    
  3. 数据清洗:结合使用

    String cleanInput = StringUtils.isBlank(rawInput) ? null : rawInput.trim();
    
  4. 配置项处理:使用 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()

posted on 2025-06-17 16:03  sunny123456  阅读(134)  评论(0)    收藏  举报