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
或空的三种方式:
- 转换为 String 检查(不推荐,有额外开销)
- 使用
length()
方法(推荐,性能好) - 使用
isEmpty()
方法(最推荐,简洁直观)
这些检查能有效避免 NullPointerException
和对空数据的意外处理。完整示例代码可在 GitHub 获取。