hashmap原始容量为什么设置为16?

已经两次面试被问到这个问题了
全部评论
因为2的幂次方拥有更低的碰撞几率和更高的查询速率。这才是他想考你的吧。
点赞 回复 分享
发布于 2017-07-04 12:54
HashMap中通过h&(length-1)的方法来代替取模  static int indexFor(int h, int length) { //根据hash值和数组长度算出索引值 return h & (length-1); } l ength为2的整数次幂的话,h&(length-1)就相当于对length取模,这样便保证了散列的均匀,同时也提升了效率;其次,length为2的整数次幂的话,为偶数,这样length-1为奇数,奇数的最后一位是1,这样便保证了h&(length-1)的最后一位可能为0,也可能为1(这取决于h的值),即与后的结果可能为偶数,也可能为奇数,这样便可以保证散列的均匀性,而如果length为奇数的话,很明显length-1为偶数,它的最后一位是0,这样h&(length-1)的最后一位肯定为0,即只能为偶数,这样任何hash值都只会被散列到数组的偶数下标位置上,这便浪费了近一半的空间,因此,length取2的整数次幂,是为了使不同hash值发生碰撞的概率较小,这样就能使元素在哈希表中均匀地散列 
5 回复 分享
发布于 2017-07-04 13:22
应该是为了减少散列碰撞和避免空间浪费吧,java的散列函数是通过hashcode和length-1计算的,他的容量必须是2的n次方。如果一开始是14二进制1110,最后一位为0,导致散列函数计算后0001,0101等永远不会出现,位置不能存放元素,空间浪费,增加了散列碰撞。散列函数的设计就是围绕减少散列碰撞和使元素分布均匀(整个数组都能存放)而设计的。
点赞 回复 分享
发布于 2017-07-04 13:18
计算数组索引更加方便
点赞 回复 分享
发布于 2017-07-04 14:58
感觉都说得有道理,大家是怎么找到的相关资料的?我百度、google都没搜到呀
点赞 回复 分享
发布于 2017-07-05 08:46

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
42
分享
牛客网
牛客企业服务