Arrays.deepHashCode()用于递归计算多维数组内容哈希码,确保内容相同的多维数组获得相同哈希值;而普通数组的hashCode()仅返回内存地址相关值,与内容无关。

Java 中 hashCode 方法对数组对象**不直接重写**,也就是说,普通数组(如 int[]、String[]、Object[])本身是对象,但它们继承的是 Object 类的默认 hashCode() 实现——即基于内存地址的哈希值,与数组内容无关。
Arrays.hashCode() 才是真正按内容计算数组哈希的工具方法
要根据数组元素内容生成哈希码,必须使用 java.util.Arrays 提供的静态方法:Arrays.hashCode()(适用于一维数组)或 Arrays.deepHashCode()(适用于嵌套/多维数组)。
-
基本类型数组(如
int[]、byte[]): 按公式result = 31 * result + element[i]累积计算,初始result = 1;空数组返回1;null数组返回0。 -
对象数组(如
String[]、Object[]): 对每个元素调用Objects.hashCode(e):若元素为null,算作0;否则调用其自身的hashCode();再按同样乘加公式累积。 -
注意陷阱:
若
Object[]中存的是二维数组(如int[][]),Arrays.hashCode()不会展开它,而是直接调用该子数组对象的默认hashCode()(即地址哈希),结果不稳定、与内容无关。
Arrays.deepHashCode() 用于真正“看内容”的嵌套结构
当数组含多层嵌套(如 int[][]、Object[][] 或 Object[] 中混有数组和字符串)时,必须用 deepHashCode():
- 遇到基本类型数组(如
int[]),调用对应专用 deep 方法(如deepHashCode(int[]))逐元素计算; - 遇到对象数组(如
Object[]),对每个元素递归调用deepHashCode(); - 若元素是普通对象(如
String),调用其hashCode();若为null,统一视为0。
为什么不能直接用数组对象的 hashCode()?
因为数组类(如 [I 表示 int[])没有重写 Object.hashCode()。它的哈希值由 JVM 决定,通常等价于 System.identityHashCode(),反映的是对象实例身份,而非内容。这意味着:
立即学习“Java免费学习笔记(深入)”;
- 两个内容完全相同的
int[]{1,2}数组,只要不是同一个对象,hashCode()很可能不同; - 在
HashMap或HashSet中直接用数组作 key,几乎无法正确查找或去重。
实际使用建议
判断用哪个方法,只看一个标准:是否需要哈希值体现数组的“内容一致性”。
- 纯一维、无嵌套 → 用
Arrays.hashCode(),性能略优; - 含二维及以上数组、或
Object[]中可能存数组 → 必须用Arrays.deepHashCode(); - 重写
equals()和hashCode()时,若字段是多维数组,hashCode()必须配deepHashCode(),equals()必须配Arrays.deepEquals(),否则哈希表行为异常。


















