浅谈HashMap的扩容

HashMap是Java中常用的数据结构之一,它通过key-value的方式存储数据,以便于快速查找和访问。当HashMap中的元素数量超过了它的负载因子(load factor)与容量(capacity)的乘积时,就需要对HashMap进行扩容,以保证HashMap的性能。下面我们来浅谈一下HashMap的扩容机制,以及用代码示例演示HashMap的扩容过程。

首先,HashMap的扩容会发生在put操作时,即往HashMap中添加一个新的键值对时。在put操作中,当HashMap中的元素数量超过了它的负载因子与容量的乘积时,就需要对HashMap进行扩容。具体的扩容过程包括以下几个步骤:

接下来,我们用代码示例来演示HashMap的扩容过程:

  1. 计算新的容量 首先,需要计算新的HashMap的容量。计算公式如下:
    newCapacity = oldCapacity << 1;
    

    其中,<< 是位运算符,表示将 oldCapacity 左移一位,相当于乘以 2。

  2. 创建新的数组 根据计算出的新容量,创建一个新的Entry数组。

  3. 将旧数组中的元素复制到新数组中 将旧的Entry数组中的元素复制到新的Entry数组中,这个过程可能比较耗时。

  4. 计算新的hash值并插入到新的数组中 将新的元素插入到新的Entry数组中,并计算它们在数组中的位置。

  5. 调整threshold 最后,更新HashMap的阈值threshold,它等于新的容量与负载因子的乘积。

    import java.util.HashMap;
    
    public class HashMapExample {
        public static void main(String[] args) {
            HashMap map = new HashMap<>(4);
            map.put("key1", "value1");
            map.put("key2", "value2");
            map.put("key3", "value3");
            map.put("key4", "value4");
            map.put("key5", "value5");
        }
    }
    

    上面的代码中,我们创建了一个初始容量为4的HashMap,并添加了5个元素。由于HashMap的负载因子默认为0.75,当元素数量达到3时,HashMap就会进行扩容。接下来,我们通过debug模式来查看HashMap的扩容过程。

    在put操作中,当元素数量达到阈值时,会调用resize方法进行扩容。在resize方法中,会根据当前容量计算出新容量,并创建新的Entry数组。具体代码如下:

    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, initHashSeed
    

你可能感兴趣的:(#,后端,Java,HashMap,数据结构与算法,java,数据结构)