HashMap理解

HashMap名词解释

  1. HasMap 存储Key-Value的键值对。 每个键值对 也叫做Entry
  2. 这些键值对(Entity) 分散存储在一个数组当中,这个数组就是HashMap的主干
  3. HashMap数组的每个元素的初始值都为Null
  4. 常用的HashMap方法: GET 、Put

PUT的原理

  1. 利用一个哈希函数来确定Entry的插入位置(index)
    1. index = Hash(“apple”);
  2. HashMap 长度有限,当插入的Entry 越来越多,会出现index 冲突
    1. 解决方案链表
      1. HashMap数组的每一个元素不止是一个Entry对象,也是一个链表的头节点。每一个Entry对象通过Next指针指向它的下一个Entry节点。当新来的Entry映射到冲突的数组位置时,只需要插入到对应的链表即可;
      2. 注意点:新来的Entry节点插入链表时,使用的是“头插法”,之所以把Entry6放在头节点,是因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。

GET方法的原理

  1. key 做一次hash映射得到对应的index
  2. 如遇到Hash冲突,则顺应节点查找

HashMap 初始长度

  1. 默认初始长度16,每次扩展和手动初始化时,长度必须是2的幂
长度16的特殊意义
  1. 为了能够实现 hash函数的均匀分布(利用Key的HashCode值 做某种运算)

    1. 简单实现 低效版 取模运算
    2. 高效hash算法 位运算方式(公式 index = HashCode(Key) & (Length - 1))
    • 举例如下(Book的演示)
      1. 计算book的hashcode,结果为十进制的3029737,二进制的101110001110101110 1001。
      2. 假定HashMap长度是默认的16,计算Length-1的结果为十进制的15,二进制的1111。
      3. 把以上两个结果做与运算,101110001110101110 1001 & 1111 = 1001,十进制是9,所以 index=9。
    • 结论:Hash算法最终得到的index结果,完全取决于Key的Hashcode值的最后几位。

    思考:

    1. HashMap的长度是10 的情况 HashCode计算
      1. hashCode1.jpg
      2. HashCode2.jpg
      3. HashCode3.jpg
    • 结论:虽然HashCode的倒数第二第三位从0变成了1,但是运算的结果都是1001。也就是说,当HashMap长度为10的时候,有些index结果的出现几率会更大,而有些index结果永远不会出现(比如0111)!
      这样,显然不符合Hash算法均匀分布的原则。
    • 反观长度16或者其他2的幂,Length-1的值是所有二进制位全为1,这种情况下,index的结果等同于HashCode后几位的值。只要输入的HashCode本身分布均匀,Hash算法的结果就是均匀的。

参考 程序猿小灰 HashMap的理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值