HashMap几个须要注意的知识点

HashMap简介
HashMap 是java集合框架的一部分。
  • key value都容许null值 (除了非同步和容许使用 null 以外,HashMap 类与 Hashtable 大体相同)
  • 不保证映射的顺序,先存入的数据取出来的时候不必定是先取出的
  • 迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。因此,若是迭代性能很重要,则不要将初始容量设置得过高(或将加载因子设置得过低)
  • HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。默认初始容量是16,默认加载因子是0.75.
  • 由全部此类的“collection 视图方法”所返回的迭代器都是快速失败 的。除非经过迭代器自己的 remove 方法,其余任什么时候间任何方式的修改,迭代器都将抛出  ConcurrentModificationException
 
Q1:HashMap 在1.8 后底层实现原理的变化
 
在jdk8中,HashMap处理“碰撞”增长了红黑树这种数据结构,当碰撞结点较少时,采用链表存储,当较大时(>8个),采用红黑树(特色是查询时间是O(logn))存储(有一个阀值控制,大于阀值(8个),将链表存储转换成红黑树存储)
 
 
Q2:为何HashMap的容量老是2的倍数?
初始化时候
 
Q3:HashMap 是如何实现散列的?
具体能够看看 这篇博客
 
Q4:HashMap什么状况下冲突解决方式由拉链法变成红黑树方式?
当链表长度>= 7的时候
 
Q5:HashMap是如何实现扩容的?
 
Q6:HashMap在高并发下若是没有处理线程安全会有怎样的安全隐患,具体表现是什么?
  Hashmap在插入元素过多的时候须要进行Resize, Resize的条件是 HashMap.Size >= Capacity * LoadFactor。
  Hashmap的Resize包含扩容和ReHash两个步骤,ReHash在并发的状况下可能会造成链表环。
  具体状况能够查看 这篇博客
相关文章
相关标签/搜索