HashMap简介
HashMap 是java集合框架的一部分。
-
key value都容许null值 (除了非同步和容许使用 null 以外,HashMap 类与 Hashtable 大体相同)
-
不保证映射的顺序,先存入的数据取出来的时候不必定是先取出的
-
迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。因此,若是迭代性能很重要,则不要将初始容量设置得过高(或将加载因子设置得过低)
-
HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。默认初始容量是16,默认加载因子是0.75.
-
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在并发的状况下可能会造成链表环。