hashmap1.7和1.8的区别

底层结构:

        hashmap1.7底层结构是entry数组+链表,

        hashmap1.8底层结构是node数组+链表+红黑树

扩容策略:7上8下(7前8后)

        1.8会保持原链表的顺序并且在元素插入后检测是否需要扩容,扩容后,不会把所有元素重新计算一遍位置;

        1.7会颠倒链表的顺序并且在元素插入前检测是否需要扩容,扩容后,把所有元素重新计算一遍位置,为了降低hash冲突;

Hashmap中文名哈希映射,是基于哈希表的 Map 接口的实现,HashMap是一个用于存储Key-Value键值对的集合。

相同key,新值会在数组的位置把旧value值覆盖掉,并返回旧的value值,如果是不同key,但是key计算出来的hash一样,则会在数组中,按照7上8下生成链表;

1.8什么时候转红黑树,什么时候退化成链表

红黑树的出现时机(链表树化):1. 链表的长度达到8; 2. 元素的总数量达到64。

底层数组类型:

        1.7数组类型:entry数组

        1.8数组类型:node数组

1.7:

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的幂次方进行位运算速度是最快的

1.8:

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

你可能感兴趣的:(个人随记,哈希算法,链表,散列表)