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 Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 语法:`str.contentEquals(sb)` —— 调用方必须是
String,参数是StringBuilder(或其它CharSequence) - 返回
true当且仅当两者长度相等且每个位置的字符完全相同(区分大小写) - 若传入
null,会抛出NullPointerException,需提前判空
实际使用示例
以下是一个典型的安全比较写法:
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())实现零分配忽略大小写比较
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










