HashMap的put方法会根据放入对象的hash值和底层桶的数量去计算放入的位置,源码中是根据对象的hash值和桶的数量-1做与运。这其实和取模运算差不多,而桶的数量只能是2的n次方是为了使与运算和取模运算的结果近似相同。所以不同的hash值在经过计算之后可能位于相同的桶中(hash冲突后形成链表或红黑树)。能证明这个观点的最佳方式是将加载因子调整到大于1的数值,hash值不同的对象放入了相同的桶中。
举例:创建一个初始容量为16,加载因子为1.5F的HashMap。根据threshold = (capacity * loadFactor),HashMap的实际容量是根据桶的数量乘以加载因子,所以这个HashMap的实际容量为24。而我们将字符串1-24作为key放入map中时会观察到11、22在一个组,1、12、23在一个组。。。这是因为按正常想法一个桶数量只有16的HashMap如何存放24个元素,只能有一部分元素接受hash冲突,而这部分元素的hash值不相等,但是他们与运算之后的位置相同,所以被放在了一个桶中,形成链表或红黑树。