请你说下HashMap的底层原理?(HashMap的底层实现)

        本文转载自JavaGuide和另一博客(点击链接即可访问),并以通俗易懂的语言修改编辑上述内容,作为面试答复,本文仅作学习记录。

HashMap的底层原理:

   HashMap 底层数组和链表 (JDK1.8 及之后是数组+链表/红黑树)结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode() 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度,即对数组长度作取模运算)。如果当前链表位置不存在任何元素的话,就直接再链表尾部插入该元素;否则,采用拉链法,即:通过equals()方法将该键值对的key与链表上的所有节点的key作比较:若结果为都false,则在链表尾部插入;若对比其中一个节点的结果为true,则将该节点上的value值覆盖。


以下对上述内容作详细深入:

        扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法(即扰动函数)是为了防止一些实现比较差的 hashCode() 方法,换句话说使用扰动函数之后可以减少碰撞。

(下面给出HashMap的hash()方法的源码):

    static final int hash(Object key) {
      int h;
      // hashCode():本地方法,返回散列值即返回对象的内存地址
      // ^ :按位异或
      // >>>:无符号右移,忽略符号位,空位都以0补齐
      return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
  }

        解析源码(详文参考请移步):

       调用该元素的key的hashcode()方法,获取散列值h(h = key.hashCode(),本质位32位的int类型数据),并将散列值h的高16位和低16位作异或^运算,得出hash值。最后将hash值对数组长度作取模运算即hash & (n-1),取模运算上述源码没有给出),从而获得对应的数组下标,即该元素需要插入的下标位置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值