Objects.deepEquals() 是 Java 中用于深度比较两个对象内容是否相等的工具方法,支持多维数组、集合及嵌套对象,自动递归比较且 null 安全,但要求类型一致、不处理循环引用。
objects.deepequals() 是 java 中专门用于深度比较两个对象内容是否相等的工具方法,它能自动处理多维数组、集合、嵌套对象等结构,无需手动遍历或重写 equals() —— 只要内部元素类型本身支持合理比较(如基本类型包装类、string、其他已正确实现 equals() 的类,或也支持 deepequals 的数组)。
支持的嵌套结构类型
该方法对以下结构有原生支持:
- 任意维度的原始类型数组(
int[]、double[][]等)和引用类型数组(String[][]、Person[][]等) - 包含数组或嵌套对象的
List、Set、Map(前提是其元素可被 deepEquals 处理) - 自定义对象,只要其字段值能被递归比较(例如字段是 String、数组、或其它已正确实现
equals()的对象) -
注意:若自定义类未重写
equals(),则默认使用 == 比较引用,deepEquals 也会沿用此行为 —— 此时需确保该类逻辑上可比较
基本用法与注意事项
直接传入两个待比较对象即可,返回 boolean:
Integer[][] a = {{1, 2}, {3}};
Integer[][] b = {{1, 2}, {3}};
boolean same = Objects.deepEquals(a, b); // true
常见易错点:
-
null 安全:任一参数为
null时,仅当两者都为null才返回true;一个null一个非null返回false -
类型一致性:两个数组必须是同一类型(如
int[][]和Integer[][]不兼容),否则直接返回false -
不依赖 hashCode:与
Objects.equals()不同,deepEquals()不调用hashCode(),因此不要求对象实现hashCode()
处理自定义嵌套对象的技巧
若对象中包含数组或深层嵌套结构,只需确保各层字段满足 deepEquals 要求:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
class Data {
int[] values;
List<string> rows;
Data nested;
// 不需要重写 equals(),deepEquals 会自动递归处理字段
}</string>
使用示例:
- 字段是基本类型数组 → 自动按元素逐个比较
- 字段是
List<string></string>→ 先比 list 大小和顺序,再对每个String[]调用deepEquals - 字段是另一个自定义对象 → 若该对象字段均为可 deepEquals 类型,则整体可比;否则需确保其
equals()合理实现
替代方案与性能提醒
在多数测试或配置校验场景中,deepEquals() 简洁可靠。但需注意:
- 它会完整遍历所有嵌套层级,对超大嵌套结构可能有性能开销
- 不提供差异详情(比如哪一层不等),如需定位差异,可考虑
AssertJ的usingRecursiveComparison()或 Jackson 的 JSON 树对比 - 若对象含循环引用,
deepEquals()会因无限递归抛出StackOverflowError—— 此时需预处理(如用标识位剪枝)或换用专用库(如 Google Guava 的Equivalence)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










