大厂面试爱问的HashMap死锁问题,看这一篇就够了


经历过大厂面试或者有所了解的同学都应该知道,HashMap是面试时面试官特别喜欢的问题,除了HashMap的扩容方式,为什么扩容的2的次幂等以外,还经常会问到HashMap死锁的相关问题。最常出现的死锁问题的是在JDK 1.7版本,为了理解死锁问题产生的原因我们来从源码和一些相关概念开始说起。

JDK 1.7 HashMap源码分析

put()方法

public V put(K key, V value) {
         if (table == EMPTY_TABLE) {
             inflateTable(threshold);
         }
         if (key == null)
             return putForNullKey(value);
         int hash = hash(key);
         int i = indexFor(hash, table.length);
         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
             Object k;
             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                 V oldValue = e.value;
                 e.value = value;
                 e.recordAccess(this);
                 return oldValue;
             }
         } 
         modCount++;
         addEntry(hash, key, value, i);
         return null;
         }

put()方法可以总结成以下四个过程:

  1. 特殊 key 值处理,key 为 null;(在JDK 1.7版本 key可以为null,如果是第一次put会被用头插法存在bucket[0]的位置,在JDK1.8以后则会直接报异常)

  2. 计算 table 中目标 bucket 的下标;

    int i = indexFor(hash, table.length);
    indexFor的源码如下:
    
    /** * Returns index for hash code h. */static int 
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值