【问题标题】:How is the Arrays.hashCode implemented? [duplicate]Arrays.hashCode 是如何实现的? [复制]
【发布时间】:2019-03-02 08:18:16
【问题描述】:

我正在阅读下面提供的Arrays.hashCode 的代码,

public static int hashCode(Object a[]) {
        if (a == null)
            return 0;

        int result = 1;

        for (Object element : a)
            result = 31 * result + (element == null ? 0 : element.hashCode());

        return result;
    }

我发现为什么选择31 用于散列还不清楚。

其次,element.hashCode() 将我发送到定义它的 Object 类:

@HotSpotIntrinsicCandidate
public native int hashCode();

如何为每次迭代计算element.hashCode()

谢谢。

【问题讨论】:

  • I find it's not as clear as for why 31 is chosen for the hashing. 因为它的素数。
  • @tkausl 还有很多较小的素数,例如,为什么不选择17?背后可能有一些强有力的理由。
  • 它说明了为什么使用幻数不是一个好习惯。
  • @AmitBera 该链接解释得很好。很快,Java 选择了 31 来优化计算成本。
  • "element.hashCode() 是如何计算的" - 每个类都可以实现(覆盖)hashCode 方法;例如Integer 只是返回它的值

标签: java hash


【解决方案1】:

来自Effective Java一书:

选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。 31 的一个很好的特性是乘法可以用移位和减法代替以获得更好的性能:31 * i == (i

【讨论】:

  • 我测试了小数字,仍然发现(i << 5) - i 更快
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 2020-09-30
  • 2011-09-16
  • 2012-12-15
  • 2012-06-26
  • 2010-09-07
  • 2016-11-05
相关资源
最近更新 更多