HashMap的继承:
![](https://img-blog.csdnimg.cn/img_convert/ee4aea74bb1ddb744e0252e3b8d007e1.jpeg)
HashMap实现了Cloneable接口,所以可以被克隆
HashMap实现了Serializable接口,可以被序列化
HashMap继承了AbstractMap并实现了Map接口,具有Map接口的所有功能
存储结构:
JDK1.7(包括1.7)之前HashMap底层是数组+链表结合而成的高级数据结构,即 链表散列,之所以要使用链表是因为,HashMap在存储数据是通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就产生了Hash冲突,然后通过拉链法解决冲突,即将Hash值相同但值不同的元素以链表的形式放置在链表的尾部。但是链表长度太长查询效率就会变低,所以在jdk8作了优化
在jdk1.8后,在链表长度大于8且容量>=64,就会进行树化,即链表转红黑树。数组的查询效率为O(1),链表的查询效率是O(k),红黑树的查询效率是O(log n)。所以当元素数量非常多的时候,转化为红黑树能极大地提高查询效率
源码解析(jdk1.8):
/**
* 默认的初始容量为16
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16