String.contentEquals() 可安全高效比较 String 与 StringBuilder 等 CharSequence 内容,避免 toString() 创建临时对象;它逐字符比对、O(n) 时间复杂度、不重写 equals() 的引用比较缺陷,但需注意 null 检查且不支持忽略大小写。

String.contentEquals() 是 Java 中一个被低估但非常实用的方法,它能安全、高效地比较 String 与可变字符序列(如 StringBuilder、StringBuffer)的内容是否完全相同,而无需将后者转换为新字符串。
为什么不用 equals() 或 toString().equals()?
直接调用 StringBuilder.equals() 会返回 false(因为 StringBuilder 没有重写 equals(),它继承自 Object,比较的是引用);而 sb.toString().equals(str) 虽然可行,但会创建新的 String 对象,带来不必要的内存开销和 GC 压力。特别是对大文本或高频调用场景,这种开销不容忽视。
contentEquals() 的正确用法
String.contentEquals(CharSequence cs) 接收任意实现了 CharSequence 接口的对象(包括 StringBuilder、StringBuffer、String、CharBuffer 等),逐字符比对内容,不创建中间对象,时间复杂度为 O(n),空间复杂度为 O(1)。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 语法:`str.contentEquals(sb)` —— 调用方必须是
String,参数是StringBuilder(或其它CharSequence) - 返回
true当且仅当两者长度相等且每个位置的字符完全相同(区分大小写) - 若传入
null,会抛出NullPointerException,需提前判空
实际使用示例
以下是一个典型的安全比较写法:
立即学习“Java免费学习笔记(深入)”;
String str = "hello world";
StringBuilder sb = new StringBuilder("hello world");
// ✅ 推荐:直接比较,无额外对象
boolean isEqual = str.contentEquals(sb); // true
// ❌ 不推荐:触发 toString(),生成新 String
boolean isEqualBad = str.equals(sb.toString()); // true,但有开销
// ⚠️ 注意 null 安全
if (sb != null && str != null) {
boolean safeCheck = str.contentEquals(sb);
}
与 contentEquals(StringBuffer) 和 equalsIgnoreCase 的关系
contentEquals() 同样适用于 StringBuffer,线程安全性由 StringBuffer 自身保证,方法本身不涉及同步;但它**不支持忽略大小写的比较**。如需忽略大小写,可改用 String.equalsIgnoreCase() 配合 sb.toString()(此时开销可接受,因忽略大小写本身就需要遍历+转换),或手动转为统一大小写后用 contentEquals():
- `str.toLowerCase().contentEquals(sb.toString().toLowerCase())`(简单但仍有临时字符串)
- 更优:用
String.regionMatches(true, 0, sb, 0, sb.length())实现零分配忽略大小写比较

















