请你说下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),取模运算上述源码没有给出),从而获得对应的数组下标,即该元素需要插入的下标位置。

你可能感兴趣的:(java,HashMap底层原理)