简单介绍一下 HashMap 的原理(包括存储结构、哈希函数、碰撞处理等)
HashMap 是 Java 中常用的哈希表实现,基于哈希原理存储键值对。其核心原理涉及存储结构、哈希函数和碰撞处理三个关键部分。
存储结构:HashMap 采用数组 + 链表 + 红黑树的复合结构。数组是 HashMap 的主体,每个元素称为桶(Bucket)。当发生哈希冲突时,相同哈希值的元素会以链表形式存储在桶中。当链表长度超过阈值(默认 8)且数组长度达到 64 时,链表会转换为红黑树,以提高查询效率。
哈希函数:HashMap 通过哈希函数将键的 hashCode 映射到数组索引。为了减少哈希冲突,HashMap 对键的 hashCode 进行二次哈希处理,通过(h = key.hashCode()) ^ (h >>> 16)
将高位信息与低位信息混合,降低哈希碰撞概率。然后通过(n - 1) & hash
计算数组索引,其中 n 为数组长度。
碰撞处理:当两个不同的键计算出相同的哈希值时,发生哈希碰撞。HashMap 采用链地址法处理碰撞,将冲突的元素放入同一桶的链表中。为避免链表过长导致性能下降,当链表长度达到 8 且数组长度≥64 时,链表转换为红黑树(时间复杂度从 O (n) 降为 O (log n))。当红黑树节点数减少到 6 时,树结构会转回链表。
HashMap 调用 put 方法的执行流程是怎样的?
HashMap 的 put 方法用于存储