Java中HashMap的实现并不是简单的开链法,而是在开链法的基础上加上了搜索树的方法。
默认负载因子:0.75 默认数组大小:16
上述两个参数都可以利用构造参数提供自定义的容量和负载因子,需要注意的是如果自定义容量,容量会提升到2的幂次,不一定是自定义的大小。
扩容操作: 数组扩展为原来的2倍的容量,原来位置的元素要么还在原来的位置,要么在2倍偏移的位置。
put()操作:利用hash找到应该放入数组的位置,如果该位置没有元素,则生成一个元素放入数组中。
元素存在的情况下:如果是树节点,按照树节点的插入方式插入,否则,按照链表方式将新节点放入到链表最后,判断 是否需要转换成树,根据链表节点个数是否大于阈值。
判断是否需要扩容。根据HashMap中的元素个数是否大于阈值(此阈值是扩容阈值,是数组容量和负载因子的乘积)。
链表的树化操作:
1. 先将链表节点都变成树节点。
2. 按照红黑树的方式进行插入调整
3. 利用hash计算出的数组位置存放根节点,(树节点既能表示左右孩子,也能够表示链表的前一个节点,后一个节点),更改根节点在链表中的位置,调整到链表最前面。
本文详细解析了Java中HashMap的实现原理,包括其默认负载因子、数组大小、扩容操作及put()方法的工作流程。同时,文章深入探讨了链表树化的过程,从节点转换到红黑树调整,再到根节点位置的确定。

1733

被折叠的 条评论
为什么被折叠?



