返回

ArrayList源代码中的扩容机制

后端

了解ArrayList数据结构的深处:从源代码看它的扩容机制

ArrayList 简介

ArrayList 是 Java 中最常用的数据结构之一,它实现了 List 接口,可以动态地增加或删除元素。ArrayList 内部使用数组来存储元素,当数组空间不足时,ArrayList 会自动扩容。

ArrayList 源码分析

为了更好地理解 ArrayList 的工作原理,我们来看看它的源码。ArrayList 的源码位于 java.util 包中,我们可以使用反编译工具查看它的源码。

public class ArrayList<E> implements List<E> {

    private Object[] elementData; // 数组,存储元素
    private int size; // ArrayList 的大小

    // ... 省略其他代码

    public boolean add(E e) {
        // 如果数组已满,则扩容
        if (size == elementData.length) {
            grow();
        }

        // 将元素添加到数组中
        elementData[size++] = e;

        // 返回 true,表示添加成功
        return true;
    }

    private void grow() {
        // 创建一个新的数组,容量是原数组的 1.5 倍
        Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];

        // 将原数组中的元素复制到新数组中
        System.arraycopy(elementData, 0, newArray, 0, size);

        // 将新数组赋值给 elementData
        elementData = newArray;
    }

    // ... 省略其他代码
}

从源码中可以看出,ArrayList 内部使用数组来存储元素。当数组空间不足时,ArrayList 会调用 grow() 方法来扩容。grow() 方法会创建一个新的数组,容量是原数组的 1.5 倍,然后将原数组中的元素复制到新数组中。最后,将新数组赋值给 elementData。

ArrayList 扩容机制分析

ArrayList 的扩容机制非常简单,它就是通过创建一个新的数组,容量是原数组的 1.5 倍,然后将原数组中的元素复制到新数组中。这种扩容机制可以保证 ArrayList 可以在不中断的情况下动态地增加或删除元素。

ArrayList 的扩容机制也存在一些问题。首先,当 ArrayList 的容量很大时,扩容操作可能会很耗时。其次,当 ArrayList 的容量很小时,扩容操作也会很耗时。为了解决这些问题,我们可以使用以下两种方法:

  • 使用初始容量:在创建 ArrayList 时,我们可以指定初始容量。这样可以避免在 ArrayList 容量很小时进行扩容操作。
  • 使用扩容因子:我们可以指定 ArrayList 的扩容因子。扩容因子决定了 ArrayList 在扩容时的大小。扩容因子越大,ArrayList 扩容的次数就越少。

结语

ArrayList 是 Java 中常用的数据结构之一,它实现了 List 接口,可以动态地增加或删除元素。ArrayList 内部使用数组来存储元素,当数组空间不足时,ArrayList 会自动扩容。

ArrayList 的扩容机制非常简单,它就是通过创建一个新的数组,容量是原数组的 1.5 倍,然后将原数组中的元素复制到新数组中。这种扩容机制可以保证 ArrayList 可以在不中断的情况下动态地增加或删除元素。

ArrayList 的扩容机制也存在一些问题,我们可以使用初始容量和扩容因子来解决这些问题。