探秘ArrayList源码:Java动态数组的背后实现
在Java中,ArrayList是一个动态数组,用于存储对象引用序列。以下是ArrayList的一些核心方法的简化版本源代码,以解释其工作原理:
public class ArrayList<E> {
private Object[] elementData;
private int size;
public ArrayList() {
this(10); // 默认初始容量为10
}
public ArrayList(int initialCapacity) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
this.elementData = new Object[initialCapacity];
}
public boolean add(E e) {
ensureCapacity(size + 1); // 确保数组有足够空间
elementData[size++] = e; // 添加元素并增加size
return true;
}
public E get(int index) {
rangeCheck(index);
return (E) elementData[index]; // 返回指定位置的元素
}
private void ensureCapacity(int minCapacity) {
if (minCapacity - elementData.length > 0) {
grow(minCapacity); // 如果需求容量大于当前数组长度,进行扩容
}
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); // 新容量为旧容量的1.5倍
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity); // 复制到新数组
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
这个简化版本的ArrayList展示了数组动态扩展的基本原理。当添加元素时,如果数组已满,则通过grow
方法创建一个新的数组,并将旧数组的内容复制到新数组。这种方式使得ArrayList可以在添加大量元素时自动管理内存。
评论已关闭