• 粪发涂墙-4123


    void transfer(Entry[] newTable, boolean rehash) {  
            int newCapacity = newTable.length;  
            for (Entry<K,V> e : table) {  
      
                while(null != e) {  
                    Entry<K,V> next = e.next;           
                    if (rehash) {  
                        e.hash = null == e.key ? 0 : hash(e.key);  
                    }  
                    int i = indexFor(e.hash, newCapacity);   
                    e.next = newTable[i];  
                    newTable[i] = e;  
                    e = next;  
                } 
            }  
        }  

    HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的。所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,这是一个常用的操作,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize

    那么HashMap什么时候进行扩容呢?当HashMap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过16*0.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。

  • 相关阅读:
    15-01-18 C# 面向对象 13
    15-01-15 C# 面向对象 12
    15-01-12 C# 面向对象 11
    15-01-11 C# 面向对象 10
    15-01-10 C# 面向对象 09
    了解 Azure 中的无服务器计算
    了解 Azure 虚拟机
    什么是 Azure?
    云服务的类型
    云部署模型
  • 原文地址:https://www.cnblogs.com/longxok/p/11315113.html
Copyright © 2020-2023  润新知