HashMap的常见重点

1. 它是HastSet的内部容器。

2. 它的数据结构是链表散列。

3. Entry需要实现hashcode方法,默认为key和value的异或。

4. HashMap保证均匀分布的方法:在存放Entry时,使用E.hash&(table.length-1),通过截取得到一个符合范围的index位置。然而要保证0~(length-1)都能取到才能使分布均匀。所以要保证length-1的二进制表示全为1,于是length必须为二的n次方。这在初始化和resize的时候进行维护就能做到。但是仍存在一个问题是由于e.hashcode()是低位被截取,所有高位的变化都被忽略了,这就意味着低位相同的Entry都会被放在一起,仍然不能保证分布均匀。于是HashMap首先在e.hashcode()基础上再次做hash,具体大致是把高位移位到低位与原值做异或,总共做了6次异或,使新值作为E.hash。这样做尽量使hashcode的每一位变化都能在截断之后仍能体现。在得到了index之后,如果发生了碰撞,放在该位置的链表的第一位。

5.resize时的transfer方法,对每一个值重新hash放置,性能消耗在此。

 

参考:http://beyond99.blog.51cto.com/1469451/429789

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值