HashMap学习笔记
1:JDK1.7与JDK1.8区别
1.7底层的数据结构是数组+链表
1.8底层的数组结构是数组+链表+红黑数
1.7 插入元素时 如果出现哈希冲突采用的是头插法
1.8 插入元素时 如果出现哈希冲突采用的尾插法
1.7在多线程情况下进行扩容操作时,有可能会出现链表循环。从而造成程序死循环。
2:为什么数组大小要设置位2的n次幂
底层数组之所以设置成为2的n次幂,是因为我们再利用key的hash值(HashMap重写了hash方法)与数组长度减一进行&运算时,只有数组长度为2的n次幂是,效果才等同于取模操作。
&运算得速度要远高于取模操作。
3:扩容时,旧数组元素如何放入新数组
扩容时,数组长度为变为原来得两倍
通过遍历原数组
通过结点元素的hash值与原数组长度进行&运算,为0的放在新数组低位,为1的放在新数组高位
巧妙的实现了概率学上能做到五五开的分部