HashMap PUT过程 扩容死循环

本文详细分析了JDK1.7中HashMap在多线程环境下扩容导致的死循环问题,该问题由头插法引起。在扩容过程中,若多个线程同时操作,可能导致元素顺序反转并引发无限循环。解决方案包括升级JDK版本、使用HashTable、ConcurrentHashMap或者通过Collections创建线程安全的HashMap。
摘要由CSDN通过智能技术生成


一、开始分析

JDK版本基于JDK1.8以上,JDK1.8以上的HashMap使用红黑树+链表的组合方式
//调用putVal方法,传入key,value
public V put(K key, V value) {
   
   return putVal(hash(key), key, value, false, true);
}

二、分析过程

先看官方说明

/**
     * Implements Map.put and related methods.
     *
     * @param hash hash for key  存储的key的hash值
     * @param key the key  存储的键值
     * @param value the value to put  存储的值
     * @param onlyIfAbsent if true, don't change existing value
     * //判断是否需要替换旧值,每次插入重复的key,替换为最新的value
     * @param evict if false, the table is in creation mode.
     * //如果为false代表还在被创建
     * @return previous value, or null if none
     */

接下来看代码

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
   
        //这里定义了四个参数
        // tab 定义一个空的Node 哈希桶数组 
        // n : 桶的长度
        // p:存储在当前位置的元素
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        //table:hashmap中的重要的组成部分 transient Node<K,V>[] table; 
        //初始化HashMap
        if ((tab = table) == null || (n = tab.length) == 0)
            //一边初始化一边给n赋值
            n =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值