HashMap学习总结

学习大佬写的HashMap解析,粗略总结   https://blog.csdn.net/woshimaxiao1/article/details/83661464

1、什么是哈希表?

答:哈希表又称散列表是一种K-Value键值对对应关系的数据结构,它通过一个关键码K,经过哈希函数,能找到存在数组上的记录,查询速度块。

2、HashMap的底层结构

答:它是底层主干是数组(哈希表的主干是数组),数组里的每个元素都是链表头。到了JDK8,增加了红黑树结构,所以,总的来说数组+链表+红黑树

3、什么是哈希冲突?

答:将value新增到hashMap中,这个value,经过哈希算法,可能算出一个地址来存放,但是这个地址上已经存在有value了,发生冲突了,该冲突就叫哈希冲突。

4、怎么解决哈希冲突?

答:用的是链地址法,也就是说在发生冲突的地址放一个链表,发生冲突元素以链表的结构存储。

5、hashMap查询快

答:hashMap有哈希表的特性查询快,可以通过K值,经过底层的哈希算法,算出哈希表上相应地址,如果这个地址存放的是预期的value,取出即可。如果这个地址存放的value不是预期值,并且这个地址存放的是一个链表,则顺着链表往下找,直到找到预期的value。

6、hashMap增删快

答:同上理,找位置,位置空,就放进去,位置不空,则实现链表追加进去。

总结:

  1. 在JDK8后,hashMap加入了红黑树结构。也就是说,发生哈希冲突,链表的元素超过8这个阈值,链表就会转换称红黑树的结构来存储。
  2. hashMap的初始容量为16,负载因子0.75,扩容方式是2的次幂。
  3. 负载因子关系着什么时候该扩容。0.75是经过计算的折中数据,哈希冲突几率较小。
  4. hashMap和hashTable的比较,可以从父类,初始容量,扩容方式,key-value是否null,线程安全多方面考虑。
  5. hashMap继承的父类是AbstractMap,初始容量16,扩容方式是2次幂,key可以为null,value不一样null,线程不安全。
  6. hashTable继承的父类是Dictionary,初始容量11,扩容方式是2次幂+1,keyh和value都为null,线程安全。

猜你喜欢

转载自blog.csdn.net/weixin_43168480/article/details/107522956