HashMap与HashTable的初始值

HashMap的初始容量是16,扩容时变为n * 2,利用位运算优化性能。而HashTable初始容量是11,扩容为2 * n + 1,选择质数以降低Hash冲突概率。HashMap不保证线程安全,HashTable则是线程安全的。
摘要由CSDN通过智能技术生成
前言

取余法是最常见的hash算法之一。HashMap和HashTable都是基于取余法来计算hashCode所对应的数组下标的,只是基于各自的特点做了一些特殊的处理,从而也导致了它们的初始值和扩容方法有所差异。

HashMap的初始值

HashMap的初始值是16,而且每次扩容 n * 2,对于我们传入的初始值,HashMap也要将其处理成最接近的2 ^ n才予以初始化。HashMap没有线程安全的处理,在设计理念上追求性能的极致。甚至连取余法这样一个步骤也得到了优化。

如果一个数 b = 2 ^ n,b - 1的二进制是0…0 …111这种形式。此时 a % b == a & (b -1),& 运算的速度当然是优于%的。HashMap就是采用了计算方式,因此HashMap的初始值才必须是2 ^ n。

HashTable的初始值

HashTable的初始值是11,扩容 2 * n + 1。HashTable是线程安全的,同步机制决定了它无法追求运行速度上的极致。在取余法的时候,使用位运算来提升效率已经意义不大了,更多的精力用在考虑解决hash冲突上。使用质数和奇数的取模运算,可以将Hash冲突的概率降低到最小。其证明过程如下:
给定两个正整数A和B,A和B拥有公约数x。证明 A % B是x的倍数

解:
(1)
∵ A、B有公约数x
∴ A = ax,B = bx,其中a、b均为正整数

(2)
设 A / B 的商为m,余数为n,则有
A % B = n
A /

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值