数据结构
HashMap 是由 数组(桶) + 链表 + 红黑树构成的;
put 流程
首先看桶节点的空间有没有开辟,没有则使用扩容开辟出桶空间,默认长度是16,接下来会判断key 是否产生hash冲突,如果没有产生hash冲突,则把此节点作为桶加入到数组中;产生hash冲突,使用链地址法来解决hash冲突的,首先判断数组节点即桶节点是树节点还是链表节点,树节点采用树节点的put方法,链表节点采用链表节点的添加方法,如果是链表的添加方式,则在添加时会判断链表长度,如果大于8,则将链表转化为红黑树
扩容机制 (resize()方法)
临界值(threshold )= 默认容量(DEFAULT_INITIAL_CAPACITY) * 默认扩容因子(DEFAULT_LOAD_FACTOR)
当hashmap中节点的数量达到临界值时,则会扩容至原来容量的2倍;
resize()方法 返回值为 tab 即为数组,是对数组进行2倍扩容。
对于旧数组中的链表节点,HashMap会将链表拆分为两个子链表,分别迁移到新数组的不同位置;
对于旧数组中的树节点,会将红黑树拆分为两个链表,若拆分后的链表长度≤6,退化为普通链表;否则,重新树化为红黑树。