这个问题在这里已有答案:
我正在阅读下面提供的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?
谢谢。
从Effective Java:
选择值31是因为它是奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以2相当于移位。使用素数的优势不太明显,但它是传统的。 31的一个很好的属性是乘法可以用移位和减法代替以获得更好的性能:31 * i ==(i << 5) - i。现代VM自动执行此类优化。