Arrays.hashCode是如何实现的? [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

我正在阅读下面提供的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();

如何计算每次迭代的qazxsw pi?

谢谢。

java hash
1个回答
3
投票

从Effective Java:

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

© www.soinside.com 2019 - 2024. All rights reserved.