Java ArrayList 源码深度解析:揭秘数组与链表的完美结合

一、ArrayList简介
ArrayList是Java集合框架中的一种动态数组实现,它允许存储可变数量的元素。在Java中,ArrayList被广泛应用于需要动态扩展数组的场景。本文将深入解析ArrayList的源码,带您领略数组与链表的完美结合。
二、ArrayList的继承关系
ArrayList类继承自AbstractList类,实现了List、RandomAccess、Cloneable和Serializable接口。以下是ArrayList的继承关系图:
```
java.lang.Object
└── java.util.AbstractList
└── java.util.ArrayList
```
三、ArrayList的成员变量
1. 元素存储数组:`transient Object[] elementData;`
2. 元素数量:`private int size;`
四、ArrayList的构造方法
1. 无参构造方法:创建一个空列表,默认容量为10。
2. 带初始容量构造方法:创建一个具有指定容量的空列表。
五、ArrayList的核心方法
1. `public boolean add(E e)`:添加元素到列表末尾。
2. `public E remove(int index)`:移除指定索引处的元素。
3. `public E get(int index)`:获取指定索引处的元素。
4. `public int size()`:返回列表中的元素数量。
六、ArrayList的扩容机制
当向ArrayList添加元素时,如果数组已满,则需要扩容。以下是ArrayList扩容的核心代码:
```java
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容1.5倍
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
```
从上述代码可以看出,ArrayList的扩容机制是将容量扩大为原来的1.5倍。这种扩容方式在大多数情况下都能满足需求,但也可能导致频繁的扩容操作。
七、ArrayList的迭代器实现
ArrayList的迭代器实现是基于游标的方式,以下是其核心代码:
```java
public Iterator
return new Itr();
}
private class Itr implements Iterator
int cursor; // 游标
int lastRet = -1; // 最后返回的元素索引
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
@SuppressWarnings("unchecked")
E e = (E) elementData[i];
lastRet = i;
return e;
}
public void remove() {
checkForComodification();
int lastRet = this.lastRet;
if (lastRet == -1)
throw new IllegalStateException();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
```
从上述代码可以看出,ArrayList的迭代器是通过游标的方式实现的,它能够高效地遍历列表中的元素。
八、总结
本文深入解析了Java ArrayList的源码,包括其继承关系、成员变量、构造方法、核心方法、扩容机制和迭代器实现。通过分析源码,我们可以更好地理解ArrayList的工作原理,为我们在实际开发中应用ArrayList提供有力支持。





