if ((p = tab[i = (n - 1) & hash]) == null)
上述是hashmap匹配数组下标的源码。主要看这一块
tab[i = (n - 1) & hash]
tab是结构里数组,n是数组长度,hash是键。
先说结论:如果n不是2的幂次方,会浪费内存,从而增加不必要的哈希冲突。
举个例子。如果这个hashmap的长度是17。那i的值就是(10000 & hash)
那么i的结果不就只有0或者16这两个结果了吗。
然后就只能在tab[0]和tab[16]里能找到数据。剩下的15个内存完全浪费了。然后又全部去和tab[0]和tab[16]冲突。
再来看看正常的2的幂次方。如果这个hashmap的长度是16。那i的值就是(1111 & hash)
那么i就可以命中数组里的所有下标。