arrays.deephashcode() 递归计算多维数组内容哈希值,对基本类型数组调用对应arrays.hashcode(),对引用类型数组递归调用自身,null元素视为0,确保内容一致则哈希一致。

Arrays.deepHashCode() 是 Java 中专门用于计算多维数组(包括嵌套任意深度的 Object 数组)内容哈希值的工具方法。它不是简单对数组引用取哈希,而是**递归遍历所有元素,对每个元素按其实际内容生成哈希,并组合成最终结果**,从而实现“内容一致 → 哈希一致”的语义。
核心原理:递归展开 + 内容感知
该方法会区分不同类型的数组元素并分别处理:
- 遇到基本类型数组(如
int[],double[][]),调用对应的Arrays.hashCode(...)(如Arrays.hashCode(int[]))计算其内容哈希; - 遇到引用类型数组(如
String[][],Object[][][]),对每个元素递归调用deepHashCode();若元素为null,按约定视为哈希值 0; - 遇到非数组的普通对象(如
String, 自定义类实例),直接调用其hashCode()方法。
典型使用方式与注意事项
只需传入最外层数组引用,无需手动递归:
-
正确写法:
int hash = Arrays.deepHashCode(arr);(arr可以是int[][]、Object[][][]等) -
错误写法:对多维数组调用
Arrays.hashCode()—— 它只对一维数组有效,对二维及以上仅哈希“引用地址”,失去内容一致性。 -
注意 null:整个数组为
null时返回 0;某层子数组为null,该位置参与哈希计算时贡献 0(例如String[][] a = {null, {"x"}};的哈希 ≠{{"x"}, null},顺序敏感)。
对比示例:deepHashCode vs hashCode
假设:
int[][] a = {{1, 2}, {3}};
int[][] b = {{1, 2}, {3}};
-
Arrays.hashCode(a) != Arrays.hashCode(b)(可能不等,因底层对象地址不同) -
Arrays.deepHashCode(a) == Arrays.deepHashCode(b)(一定相等,内容完全相同) - 再如:
Object[] objArr = {new int[]{1,2}, "hello"};,deepHashCode(objArr)会先算Arrays.hashCode(new int[]{1,2})得 95(JDK 默认算法),再结合"hello".hashCode()组合出最终值。
适用场景与局限性
适用于需要基于“深层内容”做快速判等、缓存键、集合去重等场景:
- 作为
HashMap的 key(需配合Arrays.deepEquals()实现equals()); - 单元测试中验证多维数组是否逻辑相等;
- 但注意:哈希值不保证跨 JVM 或跨 JDK 版本稳定(虽然通常不变),不可用于持久化存储或网络传输中的唯一标识。










