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

时间:2019-06-28 22:28:05

标签: java arrays hashcode

假设我要创建一个dataHashSet,它们的键是原始类型的数组,如下所示:

HashMap

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

我知道根类Set<int[]> setOfIntArrays = new HashSet<>(); Map<char[], String> mapOfCharArrays = new HashMap<>(); 包含Object,因此它可以用于任何继承类的实例(可以在其中继承或不重写)。 hashCode()类具有用于所有基本类型数组的静态Arrays方法的bunch。这些方法是否也作为“原始”类型数组的(重写)实例方法“内置”?由于数组在集合和映射中充当普通类,因此这样做似乎合乎逻辑。但是,对于类hashCode(...)来说没有Javadoc,而JLS中的"Arrays"章也没有阐明这种情况。

1 个答案:

答案 0 :(得分:5)

每个JLS 10.7的数组中确实有hashCode(加了强调):

  

数组类型的成员如下:

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

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

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

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

  •   

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

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