我正在阅读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定义它的类:@HotSpotIntrinsicCandidatepublic native int hashCode();element.hashCode()每次迭代如何计算?谢谢你。
1 回答
达令说
TA贡献1821条经验 获得超6个赞
来自《有效的 Java》一书:
选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。31 的一个很好的特性是乘法可以用移位和减法代替以获得更好的性能:31 * i == (i << 5) - i。现代虚拟机自动进行这种优化。
添加回答
举报
0/150
提交
取消