我们知道,HashMap是通过key算出hashCode,然后,通过使用hashCode当做下标来存储数据的,其实这种说法并非完全正确,比如HashMap初始容量只有16,他是怎么存储下hashCode值大于16的数据的呢?
通过观察源码,我们发现如下源码:
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}
原来是做了按位取并,相当于
比如h为1,length为16,则有如下实例。
0000 0001
&
0000 1111
=
0000 0001
按位取并,作用上相当于取模mod或者取余%。
这意味着数组下标相同,并不表示hashCode相同。
由此来分配下标。