HashMap

84 阅读1分钟
  • HashMap的原理?内部数据结构?

    • HashMap底层它是有哈希表组成,当链条过长时,将会转化为红黑树结构
  • HashMap中put方法的过程是怎样实现的?

    1. 对key求hash值,然后再计算下标
    2. 如果没有碰撞,直接放入数组中
    3. 如果碰撞了,就根据key判断是否存在于链表中,存在则直接覆盖值,不存在则以链表的方式链接到后面
    4. 如果桶满了(容量*加载因子),那么就需要调用resize方法进行扩容
      • 当链表的长度>=8且数组长度>=64时,会把链表转化成红黑树。
  • 当链表长度>=8,但数组长度<64时,会优先进行扩容,而不是转化成红黑树。

  • 当红黑树节点数<=6,自动转化成链表

  • HashMap中hash函数是怎样实现的?

    • 高16bit不变,低16bit和高16bit做了一个异或
    • 通过(n-1)&hash 得到对应的下标
  • HashMap是怎样扩容的呢?

    1. 在resize方法里,首先通过(容量*加载因子)计算出下一次扩容所需要达到的条件
    2. 当在putVal,如果对应长度达到了扩容的条件那么就会再次调用resize方法,通过 原长度<<1 移位操作 进行扩容
    3. 而对应的扩容条件也会跟随这 原扩容因子<<1 移位操作
  • HashMap中某个Entry链太长,查找时间复杂度可能达到O(n),怎么优化?

    • 其实上面已经答了,就是将链表转化为红黑树操作!
  • 参考1:juejin.cn/post/690279…

  • 参考2:juejin.cn/post/713052…