contentEquals 方法专用于安全、语义准确地逐字符比较 String 与 CharSequence(如 StringBuilder、StringBuffer),不创建新对象、不依赖类型检查、不调用 toString(),适用于已有可变序列需避免额外字符串构造的场景。

contentEquals 方法不是用来“高效比较字符串与缓冲区内容”的通用加速手段,而是为安全、语义准确地比对 String 与某些可变字符序列(如 StringBuilder、StringBuffer、CharSequence 实现)而设计的——它不依赖 equals() 的对象类型检查,也不触发字符串池或新建对象,因此在特定场景下更轻量、更可靠。
contentEquals 比的是什么?
它逐字符比较 String 的内容和传入的 CharSequence(如 StringBuilder、StringBuffer、String 本身,甚至自定义实现),不关心后者是否是不可变对象,也不调用其 toString()。这意味着:
- 不会因调用
sb.toString()创建新字符串对象,节省内存和 GC 压力 - 避免了
==或equals()对类型敏感的问题(比如sb.equals(str)可能返回false,即使内容相同) - 底层直接访问内部数组(对
StringBuilder/StringBuffer),跳过包装开销
什么时候该用 contentEquals?
典型适用场景是:你手头已有 StringBuilder 或 StringBuffer 实例(比如解析、拼接中途结果),需要判断其当前内容是否等于某个已知字符串,且不想生成中间 String 对象。
例如:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
StringBuilder sb = new StringBuilder("hello");
if (sb.contentEquals("hello")) { // ✅ 安全、无额外对象
System.out.println("match");
}
对比错误写法:
-
sb.toString().equals("hello")→ 多一次字符串构造和哈希计算 -
sb.equals("hello")→StringBuilder.equals()只对同类型返回true,此处恒为false
contentEquals 的性能与限制
它并不是“比 equals() 快很多”的万能优化。实际性能差异通常微小(纳秒级),关键优势在于语义清晰和避免副作用。注意以下几点:
- 仅适用于
CharSequence,不能直接比char[]或byte[];如需比数组,请用String.valueOf(charArr).contentEquals(...)或手动循环 - 不进行 null 安全检查 —— 若传入
null,会抛NullPointerException,调用前需自行判空 - 区分大小写,不支持忽略大小写的比较(要用
equalsIgnoreCase()配合toString())
替代方案怎么选?
根据输入类型选择更合适的比对方式:
- 比
String→ 直接用.equals() - 比
StringBuilder/StringBuffer→ 优先用.contentEquals() - 比
char[]→ 用String.valueOf(arr).equals(str)或Arrays.equals(str.toCharArray(), arr) - 需要忽略大小写 → 只能转成字符串再比,如
sb.toString().equalsIgnoreCase("HELLO")

















