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在并发的情况下可能会形成链表环。
具体情况可以查看这篇博客