猿问

Arrays.hashCode 是如何实现的?

我正在阅读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()每次迭代如何计算?


谢谢你。


智慧大石
浏览 157回答 1
1回答

达令说

来自《有效的 Java》一书:选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。31 的一个很好的特性是乘法可以用移位和减法代替以获得更好的性能:31 * i == (i << 5) - i。现代虚拟机自动进行这种优化。
随时随地看视频慕课网APP

相关分类

Java
我要回答