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的倍数?
初始化时候