我们知道hashmap中put值时是按照map的容量取余放入对应的桶中,但是源码是这样操作吗?

唉?为什么没有取余操作?
我们看到hashmap源码里面使用的操作是位运算 & 操作,但是这样和取余能达到一样的效果吗?
原来位运算符 & 在对于除数是2的n次幂减一的时候,是可以达到取余的操作的:
2的二进制减1是 0001
4的二进制减1是 0011
8的二进制减1是 0111
16的二进制减1是 1111
那么这个n = tab.length 这个参数是怎么保证是2的n次幂的呢?
我们找到源码看到table这个参数是在map初始化的时候赋值进去的,

在我们初始化map的时候,如果没有指定map的大小,默认就是16,符合条件;如果指定了参数,但不是2的n次幂,那么table的大小会变为threshold,而这个参数,是在创建map的时候赋值的,

这个方法里面操作是这样的:

所得到的结果就是比传入容量大的第一个2的n次幂的值,至此,完全符合取余操作。
结语:hashmap应该是我们开发中用的最频繁数据结构之一,其底层抛弃了传统的取余 % 操作,采用更为高效的位运算,大大提高了速度。