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

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
评论
点赞
42
分享
牛客网
牛客企业服务