假设我要创建一个data
或HashSet
,它们的键是原始类型的数组,如下所示:
HashMap
这些结构将对数组使用哪些哈希码?
我知道根类Set<int[]> setOfIntArrays = new HashSet<>();
Map<char[], String> mapOfCharArrays = new HashMap<>();
包含Object
,因此它可以用于任何继承类的实例(可以在其中继承或不重写)。 hashCode()
类具有用于所有基本类型数组的静态Arrays
方法的bunch。这些方法是否也作为“原始”类型数组的(重写)实例方法“内置”?由于数组在集合和映射中充当普通类,因此这样做似乎合乎逻辑。但是,对于类hashCode(...)
来说没有Javadoc,而JLS中的"Arrays"章也没有阐明这种情况。
答案 0 :(得分:5)
每个JLS 10.7的数组中确实有hashCode
(加了强调):
数组类型的成员如下:
公共最终字段长度,其中包含数组的组件数。长度可以是正数或零。
公共方法克隆,它覆盖类Object中相同名称的方法,并且不引发任何检查的异常。数组类型T []的clone方法的返回类型为T []。
多维数组的克隆很浅,也就是说,它仅创建一个新数组。子数组是共享的。
从Object类继承的所有成员;不继承的对象的唯一方法是其克隆方法。
这意味着hashCode
是从Object
继承的,因此是基于身份的,并且不依赖于数组中的值。
此可能是您想要的,但我建议可能不是。如果要基于数组中的值的哈希码,则需要将数组包装在实现合理的等值和哈希码的某个类中。