HashMap 的 put 方法的执行过程?

当我们想往一个 HashMap 中添加一对 key-value 时,系统首先会计算 key 的 hash 值,然后根据 hash 值确认在 table 中存储的位置。若该位置没有元素,则直接插入。否则迭代该处元素链表并依次比较其 key 的 hash 值。如果两个 hash 值相等且 key 值相等(e.hash = = hash && ((k = e.key) = = key || key.equals(k))),则用新的 Entry 的 value 覆盖原来节点的 value。如果两个 hash 值相等但 key 值不等 ,则进行插入操作。

不过呢,插入操作在 JDK1.7 和 JDK1.8 是有所不同的,JDK1.7 底层采用数组+链表,插入时采用头插法,JDK1.8,底层采用数组 + 链表 / 红黑树,并且把头插法改成了尾插法,主要是为了减少线程安全的问题,另外,当链表长度大于8,且数组长度大于64时,会把链表转化为红黑树处理,这个时候,就无关是头插还是尾插了,得按照红黑树的规则来插了。

发表评论

后才能评论

评论(2)