首页 > 解决方案 > 数组是否具有固有的 hashCode()?

问题描述

假设我想创建 aHashSet或 a HashMap,其键是原始类型的数组,如下所示:

Set<int[]> setOfIntArrays = new HashSet<>();
Map<char[], String> mapOfCharArrays = new HashMap<>();

这些结构将用于数组的哈希码是什么?

我知道根类Object包含hashCode(),因此它可以用于任何继承类的实例(其中它可能被覆盖或不被覆盖)。该类为所有原始类型的数组Arrays提供了一堆静态hashCode(...)方法。这些方法是否也“内置”为原始类型数组的(覆盖)实例方法?由于数组在集合和映射中充当普通类,因此这样做似乎是合乎逻辑的。但是,没有用于类的 javadoc,int[]而且 JLS 中的“数组”一章也没有阐明这种情况。

标签: javaarrayshashcode

解决方案


hashCode根据JLS 10.7(添加了重点) ,数组确实有:

数组类型的成员全部如下:

  • 公共最终字段长度,其中包含数组的组件数。长度可以是正数或零。

  • 公有方法clone,覆盖Object类中的同名方法,不抛出检查异常。数组类型 T[] 的克隆方法的返回类型是 T[]。

  • 多维数组的克隆是浅的,也就是说它只创建一个新数组。子数组是共享的。

  • 从类 Object 继承的所有成员;Object 唯一不被继承的方法是它的 clone 方法。

这意味着hashCode继承自Object,因此是基于身份的,并且不依赖于数组中的值。

可能是你想要的,但我建议它可能不是。如果您想要基于数组中的值的哈希码,则需要将数组包装在某个实现合理的等号和哈希码的类中。


推荐阅读