hashMap

HashMap常见面试题:

  1. HashMap的底层数据结构?

    数组,链表,和一个红黑树

  2. HashMap的存取原理?

    1. 根据hashcode找到对应的bucket之后,如果key为null,bucket的下标为

    2. 如果bucket为空,直接新建个节点

    3. 如果bucket == key,覆盖原来的值;如果bucket的节点为树节点类型,则走红黑树

    4. 遍历链表,如果找到相同的key,则覆盖原来值,并返回;在链表后边插入一个新的节点

    5. 判断容量是否大于阈值,扩容

  3. Java7和Java8的区别?

  4. 为啥会线程不安全?

  5. 有什么线程安全的类代替么?

  6. 默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂?

  7. HashMap的扩容方式?负载因子是多少?为什么是这么多?

    容量扩充为原来二倍,采用尾节点插入法,保存链的信息。(尾部插入,防止构建循环链表,让cpu 100%)

  8. HashMap的主要参数都有哪些?

    1
    2
    3
    4
    int threshold;             // 扩容阈值 
    final float loadFactor; // 负载因子
    transient int modCount; // 出现线程问题时,负责及时抛异常
    transient int size; // HashMap中实际存在的Node数量
  1. HashMap是怎么处理hash碰撞的?

    哈希表为解决冲突,可以采用开放地址法和链地址法等来解决问题,Java中HashMap采用了链地址法

  2. hash的计算规则?

    1
    (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);