hashmap1.7底层结构是entry数组+链表,
hashmap1.8底层结构是node数组+链表+红黑树
1.8会保持原链表的顺序并且在元素插入后检测是否需要扩容,扩容后,不会把所有元素重新计算一遍位置;
1.7会颠倒链表的顺序并且在元素插入前检测是否需要扩容,扩容后,把所有元素重新计算一遍位置,为了降低hash冲突;
Hashmap中文名哈希映射,是基于哈希表的 Map 接口的实现,HashMap是一个用于存储Key-Value键值对的集合。
相同key,新值会在数组的位置把旧value值覆盖掉,并返回旧的value值,如果是不同key,但是key计算出来的hash一样,则会在数组中,按照7上8下生成链表;
红黑树的出现时机(链表树化):1. 链表的长度达到8; 2. 元素的总数量达到64。
1.7数组类型:entry数组
1.8数组类型:node数组
hashMap线程不安全?hashMap在多线程的环境下,会出现什么问题?
1.会出现丢值 2.会出现环链
总结:
1:hashMap底层结构是Entry数组+单项链表
2:初始容量是0
3:第一次执行put 方法会初始容量
4:key 可以为null 并且会储存在下标为0的位置
5:hashMap为什么无序,因为它的位置是通过hash值和数组长度计算出来的
6:为什么不能重复,重复的元素,会进行values的覆盖
7:头插法:新节点会变成老节点的头节点
8:扩容机制?扩容时机?同时满足储存个数大于加载因子以及数组当前索引不为空才会扩容,扩容为原来的两倍,并重新计算阈值
9:扩容大小:是原来的两倍
10:扩容后,把所有元素重新计算一遍位置,为了降低hash冲突
11:为什么需要加载因子?
为了减少hash冲突的次数(哈希冲突就是将要存入的位置已经有值),就是减少链表的出现
12:为什么初始容量是16,这里就不是眼缘了,因为2的幂次方进行位运算速度是最快的
Java1.8 无参构造没有初始容量大小,只有在put时初始容量newCap=16
HashMap hashMap=new HashMap(8);也是在put时容量newCap=8
HashMap hashMap=new HashMap(3);不是说容量为3,而是4,大于等于最小的2的n次方
HashMap hashMap=new HashMap(3);put第4个数据时,不会报错,他会自动扩容的,是在容量*0.75即就是4*0.75=3,put第三次完成之后开始扩容(1.8扩容时会保持原链表的顺序并且在元素插入后检测是否需要扩容),新容量=旧容量*2,即就是4*2=8
参考:
【老生常谈系列】hashMap 1.7 和1.8的区别_EmineWang的博客-CSDN博客_hashmap1.7和1.8的区别
JDK1.8中的HashMap扩容原理_野狼飞飞的博客-CSDN博客_hashmap1.8扩容
HashMap1.7和1.8实现原理和区别_EmineWang的博客-CSDN博客_hashmap底层实现原理1.7和1.8