hash()
方法
hash函数的作用是使元素hash值更加发散,经过hash()处理之后,hash值的高16位没变,低16为原来的低16与高16异或的结果,即用16位来综合了高16位和低16位的影响,这样能提高key的发散性的主要原因是table的长度通常小于216 ,通过hash%table.length就能更发散
static final int hash(Object key) {
int h;
// h >>> 16即h右移16位
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
tableSizeFor()
方法
由于HashMap
的capacity
都是2的次方数,因此这个方法用于找到大于等于initialCapacity
的最小的2的幂(initialCapacity
如果就是2的幂,则返回的还是这个数)
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}