ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

HashMap的实现

2026/9/3 18:24:36 拓冰建站 浏览量
HashMap的实现 get() 与 put()方法HashMap中存储数据是用一个类型是Entry的数组而Entry则是保存键值对的数据结构并且有本身类型的next变量可以构成链表。HashMap存储数据时首先根据key的hashcode值找到应该保存在table数组的下标位置bucket的位置如果该位置之前没有保存过值也就是没有发生碰撞则保存这个键值对对象到该位置中如果发生了碰撞也就是说有两个对象的key的hashcode值相等那么则需要通过key的equals方法判断这两个对象是否是同一个对象如果是那么原本存储的旧值会被新值所替换如果不是同一个对象则把新的键值对对象保存到旧的键值对对象next节点中构成链表。equals()和hashCode()的都有什么作用通过对key的hashCode()进行hashing并按照用key的hashcode值按位与上数组长度计算下标( length-1 hash值)从而获得buckets的位置。如果产生碰撞则利用key.equals()方法去链表或树中去查找对应的节点注意key的hashcode()方法用来找到Entry对象所在的桶如果两个key有相同的hash值他们会被放在table数组的同一个桶里面jdk8之后数组链表红黑树HashMap 的 put 流程 (JDK1.8)1.首先对 key 做 hash 扰动运算得到哈希值通过哈希值算出数组桶下标。2.如果桶为空直接放入新节点。3.如果桶不为空先判断桶首节点的 key 是否相等hash 值 equals值相等则覆盖 value。 如果equals值不相等若桶是红黑树就按红黑树规则插入若是链表则遍历链表尾插新next节点途中遇到相同 key 就覆盖。 插入链表后链表长度达到 8如果数组容量小于 64 优先扩容负载因子0.75否则链表转红黑树。 最后判断元素总数超过阈值就进行扩容。