Objects.deepEquals() 能正确处理多维数组、混合嵌套集合(如 ArrayList)、集合内含数组或其他集合(如 Set)、以及任意层级的 null 值;它通过递归比较内容而非引用,避免 equals() 对数组和嵌套结构比较失效的问题。
objects.deepequals() 是 java 提供的专门用于深度比较复杂对象(包括多维数组、嵌套集合等)是否“逻辑相等”的工具方法,它能自动处理 null、数组展开、集合遍历和元素递归比较,比 equals() 更可靠。
它能正确处理哪些结构?
该方法支持以下嵌套组合的逐层递归比较:
- 多维数组:如
int[][]、String[][][]、Object[][] - 混合嵌套:如
ArrayList、HashMap> - 集合内含数组或其它集合:如
Set、List -
null值安全:任意层级出现null都不会抛NullPointerException
为什么不能直接用 equals()?
equals() 对数组默认只比较引用(即内存地址),对多维数组或含数组的集合根本无法判断内容是否一致:
int[] a = {1, 2}; int[] b = {1, 2};a.equals(b) → false(因为数组没重写 equals)Objects.deepEquals(a, b) → true
同理,ListListlist1.equals(list2) → false;Objects.deepEquals(list1, list2) → true
使用时的关键注意事项
-
必须是同一类型结构:不能拿
int[][]和Integer[][]比(基本类型数组与包装类数组不兼容) -
自定义对象需正确实现
equals()和hashCode():否则其内部字段不会被深度比较 - 性能开销略高:会完整遍历所有嵌套层级,大数据量时注意效率
-
不支持函数式/惰性结构:如 Stream、Optional 等不参与深度比较,仅按其
equals行为处理
一个典型嵌套示例
判断两个三层嵌套结构是否完全一致:
Object expected = Arrays.asList(
new int[]{1, 2},
Arrays.asList("a", "b")
);
Object actual = Arrays.asList(
new int[]{1, 2},
Arrays.asList("a", "b")
);
boolean same = Objects.deepEquals(expected, actual); // true
即使中间某层是数组、某层是 List、某层是 String,只要内容和结构一致,deepEquals 就返回 true。










