数组是否具有固有的hashCode()?

Joh*_*ane 0 java arrays hashcode

假设我要创建一个HashSet或,HashMap其键是原始类型的数组,如下所示:

Set<int[]> setOfIntArrays = new HashSet<>();
Map<char[], String> mapOfCharArrays = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

这些结构将对数组使用哪些哈希码?

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

And*_*ner 6

阵列确实有hashCode,每JLS 10.7(强调):

数组类型的成员包括以下所有:

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

  • 公共方法克隆,它覆盖类Object中相同名称的方法,并且不引发任何检查的异常。数组类型T []的clone方法的返回类型为T []。

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

  • 所有成员都继承自类Object ; 不继承的对象的唯一方法是其克隆方法。

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

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