1. 概述

StringBuilder 允许我们高效便捷地构建 String 值。在 Java 中使用 StringBuilder 时,有时需要验证它是否为 null 或空。

本教程将快速探索如何有效执行这些检查。

2. 问题引入

在实现检查 StringBuilder 是否为 null 或空之前,先简单回顾 StringBuilder 的核心概念:

  • StringBuilder 是一个可变字符序列
  • ✅ 允许修改 String 值而无需创建新实例
  • ✅ 在频繁字符串操作时更节省内存

解决这个问题的核心逻辑很简单:通过逻辑或运算符(||)连接 null 检查和空检查:

is-null-check || is-empty-check

先准备一组测试用例覆盖不同场景:

static final StringBuilder SB_NULL = null;
static final StringBuilder SB_EMPTY = new StringBuilder();
static final StringBuilder SB_EMPTY_STR = new StringBuilder("");
static final StringBuilder SB_BLANK_STR = new StringBuilder("   ");
static final StringBuilder SB_WITH_TEXT = new StringBuilder("I am a magic string");

这些用例涵盖了:

  • null 引用
  • 默认构造器创建的实例
  • 空字符串初始化
  • 空白字符串初始化
  • 包含实际文本的实例

接下来通过单元测试验证每种方案的正确性。首先看 null 检查部分。

3. 实现 null 检查

检查 StringBuilder 是否为 null 非常简单。在 Java 中,使用 == 操作符即可:

static boolean isNull(StringBuilder sb) {
    return sb == null;
}

用测试用例验证:

assertTrue(isNull(SB_NULL));
 
assertFalse(isNull(SB_EMPTY));
assertFalse(isNull(SB_EMPTY_STR));
assertFalse(isNull(SB_BLANK_STR));
assertFalse(isNull(SB_WITH_TEXT));

测试结果符合预期:仅对 SB_NULL 返回 true。接下来将 sb == null 与空检查结合。

4. 组合 null 检查和空检查

null 检查很简单,但检查 StringBuilder 是否为空有几种方式。下面逐一分析。

4.1 转换为 String 检查

StringBuilder 维护一个字符序列,可通过 toString() 转换为 String,然后检查字符串是否为空:

static boolean isNullOrEmptyByStrEmpty(StringBuilder sb) {
    return sb == null || sb.toString().isEmpty();
}

验证测试用例:

assertTrue(isNullOrEmptyByStrEmpty(SB_NULL));
assertTrue(isNullOrEmptyByStrEmpty(SB_EMPTY));
assertTrue(isNullOrEmptyByStrEmpty(SB_EMPTY_STR));
 
assertFalse(isNullOrEmptyByStrEmpty(SB_BLANK_STR));
assertFalse(isNullOrEmptyByStrEmpty(SB_WITH_TEXT));

⚠️ 注意:SB_BLANK_STR 转换后是空白字符串(长度>0),因此不被视为空。

4.2 使用 length() 方法

StringBuilder 实现了 CharSequence 接口,该接口定义了 length() 方法。直接检查长度是否为 0:

static boolean isNullOrEmptyByLength(StringBuilder sb) {
    return sb == null || sb.length() == 0;
}

测试验证:

assertTrue(isNullOrEmptyByLength(SB_NULL));
assertTrue(isNullOrEmptyByLength(SB_EMPTY));
assertTrue(isNullOrEmptyByLength(SB_EMPTY_STR));
  
assertFalse(isNullOrEmptyByLength(SB_BLANK_STR));
assertFalse(isNullOrEmptyByLength(SB_WITH_TEXT));

结果完全正确,且避免了字符串转换的开销。

4.3 使用 isEmpty() 方法

CharSequence 接口还提供了 isEmpty() 默认方法(本质是 length() == 0 的封装):

default boolean isEmpty() {
    return this.length() == 0;
}

StringBuilder 作为 CharSequence 的实现类,可直接使用此方法:

static boolean isNullOrEmpty(StringBuilder sb) {
    return sb == null || sb.isEmpty();
}

最终测试:

assertTrue(isNullOrEmpty(SB_NULL));
assertTrue(isNullOrEmpty(SB_EMPTY));
assertTrue(isNullOrEmpty(SB_EMPTY_STR));
 
assertFalse(isNullOrEmpty(SB_BLANK_STR));
assertFalse(isNullOrEmpty(SB_WITH_TEXT));

✅ 这是最简洁高效的方案,兼具可读性和性能。

5. 总结

本文探讨了在 Java 中检查 StringBuilder 是否为 null 或空的三种方式:

  1. 转换为 String 检查(不推荐,有额外开销)
  2. 使用 length() 方法(推荐,性能好)
  3. 使用 isEmpty() 方法(最推荐,简洁直观)

这些检查能有效避免 NullPointerException 和对空数据的意外处理。完整示例代码可在 GitHub 获取。


原始标题:Checking if a StringBuilder Is Null or Empty | Baeldung