hashmap的有参构造初始化容量: 不传入数字 默认是16,如果传入的数字,取的是:大于等于传入数字的第一个2的次方数:例如:传入5 则初始化容量为8; 传入10 则初始化容量为16

    • 数据结构:
      • jdk1.7:数组+链表
      • jdk1.8:数组+链表+红黑树
    • 插入方式:
      • jdk1.7 头插法
      • jdk1.8 尾插法
    • 树化:
      • 数组容量大于等于64且链表>=8
    • 树退化:
      • 扩容时退化:链表长度<=6
      • 删除时退化: 左子节点 为null 左子子节点为null 右子节点为null
    • 索引计算
      • 先用key计算hash值,在进行二次hash 然后 &运算得出索引
      • 二次hash计算可以让hash分布的更加散列
      • 扩容时:如果hash & oldcap =0 则留在原位置:索引不变,如果不等于0 新位置=旧位置+旧容量
    • 数组容量为2的n次方 可以用&运算代替 取余运算 提高效率
    • 扩容:
      • jdk1.7 :元素大于阈值且当前的位置不为null 扩容后 链表顺序颠倒(因为是头插法)
      • jdk1.8 :元素大于阈值 就扩容 扩容容量=oldcap*2
    • 多线程下安全问题
      • jdk1.7 :数据错乱,扩容死链
      • jdk1.8:数据错乱,