【JDK1.6】HashMap死循环形成原因

本文探讨了JDK1.6中HashMap在扩容时如何导致环路问题,以及get(key)操作可能导致的死循环现象。当HashMap元素超过负载阈值时,扩容resize操作会使链表重新散列,可能形成环路。而get操作若key未命中,会在遍历链表过程中持续循环,引发性能问题。
摘要由CSDN通过智能技术生成

目录

1.扩容形成环路

2.get(key)操作死循环


1.扩容形成环路

在put元素超过负载阈值时会触发HashMap的扩容resize操作,一个桶的链表会重新散列到新表中,

    /** 
    * put 插入元素之后,负载超过阈值,触发resize方法扩容 
    */  
   void addEntry(int hash, K key, V value, int bucketIndex) {  
       Entry<K,V> e = table[bucketIndex];  
       table[bucketIndex] = new Entry<K,V>(hash, key, value, e);  
       if (size++ >= threshold)  
           resize(2 * table.length);  
   }  
  
   /** 
    * resize(),transfer把旧表中的元素添加到新表中
    */  
   void resize(int newCapacity) {  
       Entry[] oldTable = table;  
       int oldCapacity = oldTable.length;  
       if (oldCapacity == MAXIMUM_CAPACITY) {  
           threshold = Integer.MAX_VALUE;  
           return;  
       }  
       Entry[] newTable = new Entry[newCapacity];   // 创建新表
       transfer(newTable);
       table = newTable;  
       threshold = (int)(newCapacity * 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值