关于HashTable和HashMap的不同点这里就不再说明,网上很多;
今天突然对这个初始化因子不通的问题有了兴趣,以前只知道不一样,从没想过为什么不一样,然后查了半天,感觉相关文章说的很少,想自己来记录一下
关于HashTable和HashMap,最重要的不过是hash了,而hash的目的就是为了尽可能的减少寻址冲突,下面边看源码变分析(1.8)
1.HashTable
使用外部对象key的hashCode()方法,经过和数组大小取模获取下标。
那么这里为什么用11,而不是用16呢(HashMap的是16)?
中间的证明,我不是很认可,因为他举例的是和 m有公约数的key,用一定条件的key来举证在所有m的位置不均匀本身就是断章取义,比如:m=9,那么公约数=3,那么key的范围只是局限于如(12、15、18、21、24、27。。),所在位置index也就是 3、6、0;但是如果key为任意数,则index的位置为 1、2、3、4、5、6、7、8、0,均匀分布;所以举证不成立;
那是不是结果就不正确呢,我认为不是,上面所说的前提的key是均匀分布的,但是实际上怎么样呢?我们知道这个key在HashTable中,是根据hashcode()方法来的,方法是属于其他对象的,并不能确定一定是均匀的,所以我们认为key不一定是均匀分布
这时候我们用一个质数(至少也是个奇数)作为桶的数量,能更大程度的减少冲突
而初始化的值也不适合过大(影响空间),所以是11
2.HashMap
HashTable是取模,HashMap却是 & ,所以只能是2的n次方(二进制都是1),这样才会尽量减少冲突,hash方法是HashMap内部的,如下
把高位的变化,通过异或运算,也映射到低位,这样,在 & 的时候才能减少冲突