HashMap源码解读
HashMap源码解读
-
HashMap为什么继承AbstractMap和实现了Map接口?
其实已经实现了Map接口,所以可以不需要继承。 -
HashMap初始化的大小为多少
HashMap的初始化大小64,最大容量1073741824,扩容因子0.75,当HashMap容量大于8时需要将链表存储转为红黑树 链表存储的查询速度大概为N/2,红黑树的查询效率在log2(n) 所以当容量为8时,链表查询速度4小于红黑树查询数据log2^8=3。 -
transient关键字的作用是什么?
对不能序列化存储的数据加上transient后,在序列化之后加上关键字的数据将不能访问。 -
HashMap允许key和value为null,当key为null时进行hash()=0。
-
谈一下hashMap中put是如何实现的?
- 将key进行hashCode计算^自己的次方,>>>16。
- 判断散列表中是否已经存在值,没有需要Resize(),并放数据直接放入到链表中
- 已经存在散列已经存在
判断key的hash是否相同,相同则覆盖。
判断是否是红黑树节点,如果是,则添加红黑树节点
非红黑树,添加要链表,判断链表大小是否大于阀值,大于,则需要转为红黑树 - 判断是否需要扩容
-
谈一下hashMap的get是如何实现的?
- 将key进行hashcode来计算出在bucket中的位置
- 判断查询的节点是什么类型,如果是红黑树,根据红黑树的算法去查询
- 如果是链表,则遍历链表去查询。
-
为什么是16?为什么必须是2的幂?如果输入值不是2的幂比如10会怎么样?
2的幂更能保证散列数据的均匀分布,减少碰撞的可能。