hashmap的结构是什么样的?那红黑树还能退化回去么?怎么扩容?负载因子,为啥翻两倍?
结构
JDK 8 中 HashMap 的数据结构是数组+链表+红黑树。
红黑树节点个数<6,转回链表
链表过长时,查询效率会比较低,于是当链表的长度超过 8 时(且数组的长度大于 64),链表就会转换为红黑树。
扩容2倍,负载因子
- 如果键值对的数量(size)/ 数组的长度,大于负载因子(默认0.75),则需要进行扩容操作。
- HashMap 的初始容量是 16,随着元素的不断添加,HashMap 就需要进行扩容,
- 阈值是capacity * loadFactor,capacity 为容量,loadFactor 为负载因子,默认为 0.75。
- 扩容后的数组大小是原来的 2 倍,然后把原来的元素重新计算哈希值,放到新的数组中。
源码分析,看其他文章