JDK源码解析之ArrayList实现原理剖析

开发者心声 2024-03-27 ⋅ 28 阅读

在Java开发中,ArrayList是一个非常常用的集合类。它底层使用数组来存储元素,并且提供了一系列操作数组的方法。本文将深入分析ArrayList的实现原理,帮助读者更深入地了解ArrayList的内部工作机制。

ArrayList的基本结构

ArrayList的底层数据结构是一个数组,初始化时默认大小为10。当数组容量不足以容纳新添加的元素时,ArrayList会通过grow()方法扩容数组大小,将原数组中的元素拷贝到新数组中。这是ArrayList实现动态扩容的关键步骤。

// ArrayList的扩容方法
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    // 新容量为原容量的1.5倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    // 复制元素到新数组中
    elementData = Arrays.copyOf(elementData, newCapacity);
}

ArrayList的常用操作

ArrayList提供了一系列常用的操作方法,例如添加元素add(), 移除元素remove(), 获取元素get()等。这些方法底层都是基于数组的操作,通过索引来获取或修改元素。下面是ArrayList中的add()方法的简化版实现:

// 添加元素到指定位置
public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);  // 扩容
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}

ArrayList的迭代器实现

ArrayList提供了Iterator迭代器来便利集合中的元素。迭代器内部维护了一个指向当前元素的游标cursor,通过hasNext()next()方法来获取下一个元素。下面是ArrayList中Iterator的简化版实现:

private class Itr implements Iterator<E> {
    int cursor;       // 游标
    int lastRet = -1; // 最后一个元素的索引

    public E next() {
        int i = cursor;
        if (i >= size)
            throw new NoSuchElementException();
        Object[] elementData = ArrayList.this.elementData;
        cursor = i + 1;
        return (E) elementData[lastRet = i];
    }

    public boolean hasNext() {
        return cursor != size;
    }
}

总结

通过本文的分析,我们了解了ArrayList的底层实现原理以及常见操作方法的实现方式。ArrayList作为一个基础的集合类,在我们日常开发中频繁使用,深入了解其内部实现对于我们提高代码质量和性能都有很大帮助。希望本文能够帮助读者更深入地了解ArrayList的运行机制,对Java集合类有更深层次的认识。


全部评论: 0

    我有话说: