第二周总结:HashMap Put函数与红黑树节点操作详解

需积分: 0 0 下载量 17 浏览量 更新于2024-08-05 收藏 70KB PDF 举报
本周的总结主要聚焦于HashMap的源码分析,特别是Put函数部分。HashMap是一种常用的数据结构,它以键值对的形式存储数据,内部实现基于哈希表,提供了高效的数据查找和插入操作。在Put函数中,我们深入了解了以下几个关键步骤: 1. 初始化与扩容: 如果当前的Node table为空或容量不足(默认初始大小为16),HashMap会首先进行扩容,通过调用`resize()`函数,将表的大小翻倍,并创建新的数组。 2. 寻找目标位置: 使用哈希函数`hash(key)`计算出key对应的数组索引`i`。然后检查该位置的节点是否存在。 3. 节点处理: - 节点不存在:如果`tab[i]`是空的,新建一个`Node`对象,将键值对存入。 - 节点存在: - 同哈希且等值:如果新插入的键的哈希值和已存在的节点哈希值以及引用的键相同或等于,直接更新该节点的值。 - 红黑树插入:如果遇到的是红黑树节点,调用`putTreeVal()`方法将其转换为树节点并插入。 - 链表结构:若以上条件都不满足,遍历链表,查找是否已有相同的键。如果找到,替换;否则,将新节点添加到链表尾部。 4. 链表长度检查: 当链表长度超过阈值(默认为`TREEIFY_THRESHOLD`,通常是8),为了保持性能,HashMap会将链表转换为红黑树,这一步称为`treeifyBin()`。 5. 节点插入后: 如果新节点是链表的最后一个元素,直接添加。如果插入过程中触发了树化,那么整个过程会涉及红黑树的插入规则,以保持其平衡性。 这部分代码展示了HashMap在处理键值对插入时的复杂逻辑,涉及到哈希计算、数据结构的转换(链表到红黑树)以及性能优化。理解这些细节对于深入学习HashMap以及实现类似数据结构至关重要。通过源码分析,我们可以更好地理解HashMap的高效性和灵活性,以及在实际开发中的应用场景。