在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集合类有更深层次的认识。
本文来自极简博客,作者:开发者心声,转载请注明原文链接:JDK源码解析之ArrayList实现原理剖析