public int hashCode() { int h = hash; int len = count; if (h == 0 && len > 0) { int off = offset; char val[] = value; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; ///看这里 } hash = h; } return h; }
1、上文使用31的原因:
(1)31是一个素数(只能被自身和1整除,减少冲突);
(2)h*31可以被虚拟机优化为(h<<5),提高算法效率;
- 注意:乘以32 才是位移运算
(3)数值尽量大,hash地址就越大,减少冲突;
(4)31只占用5bits(11111),相乘溢出概率小;