HashMap源码解读

HashMap源码解读

  1. HashMap为什么继承AbstractMap和实现了Map接口?
    HashMap源码解读
    其实已经实现了Map接口,所以可以不需要继承。

  2. HashMap初始化的大小为多少
    HashMap源码解读
    HashMap的初始化大小64,最大容量1073741824,扩容因子0.75,当HashMap容量大于8时需要将链表存储转为红黑树 链表存储的查询速度大概为N/2,红黑树的查询效率在log2(n) 所以当容量为8时,链表查询速度4小于红黑树查询数据log2^8=3。

  3. transient关键字的作用是什么?
    HashMap源码解读
    对不能序列化存储的数据加上transient后,在序列化之后加上关键字的数据将不能访问。

  4. HashMap允许key和value为null,当key为null时进行hash()=0。

  5. 谈一下hashMap中put是如何实现的?

    • 将key进行hashCode计算^自己的次方,>>>16。
    • 判断散列表中是否已经存在值,没有需要Resize(),并放数据直接放入到链表中
    • 已经存在散列已经存在
      判断key的hash是否相同,相同则覆盖。
      判断是否是红黑树节点,如果是,则添加红黑树节点
      非红黑树,添加要链表,判断链表大小是否大于阀值,大于,则需要转为红黑树
    • 判断是否需要扩容
  6. 谈一下hashMap的get是如何实现的?

    • 将key进行hashcode来计算出在bucket中的位置
    • 判断查询的节点是什么类型,如果是红黑树,根据红黑树的算法去查询
    • 如果是链表,则遍历链表去查询。
  7. 为什么是16?为什么必须是2的幂?如果输入值不是2的幂比如10会怎么样?
    2的幂更能保证散列数据的均匀分布,减少碰撞的可能。

有新内容在继续补充!