在java的内部类中,计算HashCode通常使用 code = 元素* 31 + 下一个元素
以String为例
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
为了保证hashcode值尽量避免冲突,因此用素数相乘的同时,又要保证范围较大。
而31作为一个素数,又可以优化运算
i*31== (i<<5)-1
内存也只占用5字节,因此通常选用31作为系数
另外,在Boolean中true和false的散列码为1231和1237
public static int hashCode(boolean value) { return value ? 1231 : 1237; }
本文深入探讨了Java中HashCode的计算方法,特别是内部类中使用31作为基数的原因,以及在String和Boolean类中如何实现hashCode方法以减少冲突,同时介绍了31这个素数在优化运算中的作用。
1738

被折叠的 条评论
为什么被折叠?



