JDK1.5Arrays.hashCode对比JDK1.7 Objects.hash(Object…)省略号

JDK 1.5开始Arrays类提供 static了名为“ hashCode”的重载方法。大多数重载方法接受特定基本类型的数组,但Arrays.hashCode(Object [])方法可用于计算 int引用类型数组的哈希代码。

自JDK 1.7以来,该对象类已经提供了一种方法称为散列(对象…)也返回 int哈希代码的Java对象的提供阵列(的省略号 [ ...]表示的Java可变参数作为阵列处理,并且接受一个数组) 。

这篇文章提供了 Arrays.hashCode(Object)和之间的简要比较 Objects.hash(Object...)

我们可以查看OpenJDK中的代码,看看OpenJDK如何实现这里比较的两个方法。事实证明, Arrays.hashCode(Object[])并且 Objects.hash(Object...)行为方式完全相同,因为 Objects.hash(Object...)完全委托 Arrays.hashCode(Object[])。这将显示在从OpenJDK Objects.java类中提取的下一个代码清单中。

因此,事实证明这些方法实际上是相同的,因此选择的方法主要是品味问题。它可能会吸引一些人 Arrays直接使用这种方法,无论如何都要调用它。其他人可能更喜欢 Arrays在向它传递一个已知为Java数组的构造时使用该方法,并将该 Objects方法用于以逗号分隔的组合传递值而不需要显式数组语法的情况(例如实现自定义类的 hashCode()方法并将该类的任意类型的属性传递给哈希代码计算的情况。当使用相同类型的基元数组时,最好使用该 Arrays.hashCode特定基元的适当版本。

下一个代码清单中显示的简单类(在GitHub上可用)演示了重载版本 Arrays.hashCodeObjects.hash(Object...)方法之间输出的差异和相似之处。

上面所示的代码传递三个公用数据集(原始的阵列 int值,参考阵列 Integer的值,的阵列 String值)的方法中 Arrays.hashCodeObjects.hash(Object...)Objects.hashCode(对象)接受单个方法的对象(其中整体数组符合条件)。然后,该简单示例将每个方法为每个数据集生成的相应哈希码值写入标准输出。接下来显示运行此代码的结果。

正如我们所期望的那样, Arrays.hashCode(Object[])Objects.hash(Object...)为引用类型返回相同的计算哈希码 IntegerString因为它们都是有效的实现 Arrays.hashCode(Object[])。原始的阵列 int值导致从不同的结果 Arrays.hashCode(int[])比从 Objects.hash(Object...),这是当然的,因为基元的数组传递到过载的 Arrays.hashCode(int[])专门为该原始数据类型而不是实现的方法 Arrays.hashCode(Object[])