在HashMap中增加、删除、查找键值对时,定位key值在table中的索引位置都是一个关键的步䠫。
第一步计算key值的Hash值:
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); //高16位与低16位异或降低了碰撞率! }
第二步关键代码:
int length = table.length; int index = (length - 1) & hash; //因为length是2的2次幂,因此该代码等价于int index = hash%length;
哈希桶长度是2的正整数幂的2个好处:
1:通过key的hash值计算下标时使用位运算替代取模可以进行优化。
2:扩容(resize())的时候可以快速的定位下标。
(e.hash & oldCap) == 0 /**判断e的Hash值扩容后的高一位是否是0,从而确定该元素在新桶中的位置!**/