Java ArrayList源码深度解析:揭秘数组的奥秘

一、ArrayList简介
ArrayList是Java集合框架中的一种常用类,它实现了List接口,底层采用数组实现。ArrayList提供了动态数组的功能,可以动态地增加或减少元素。在Java开发中,ArrayList被广泛应用于各种场景,如数据存储、缓存等。本文将深入解析ArrayList的源码,帮助读者了解其内部实现机制。
二、ArrayList的继承关系
ArrayList类继承自AbstractList类,并实现了List、RandomAccess、Cloneable和Serializable接口。下面是ArrayList的继承关系图:
```
java.lang.Object
├── java.util.AbstractCollection
│ ├── java.util.AbstractList
│ └── java.util.ArrayList
```
三、ArrayList的核心成员变量
1. 元素数组:elementData
ArrayList的核心成员变量是elementData,它是一个Object类型的数组,用于存储ArrayList中的元素。在ArrayList的构造方法中,会根据初始容量初始化elementData数组。
2. 元素数量:size
size变量用于记录ArrayList中元素的个数。当向ArrayList中添加或删除元素时,size变量会相应地增加或减少。
3. 扩容阈值:defaultModCount
defaultModCount变量用于记录ArrayList的修改次数,当修改次数达到扩容阈值时,ArrayList会进行扩容操作。
四、ArrayList的构造方法
ArrayList提供了多个构造方法,以下列举几个常用的构造方法:
1. 默认构造方法
```
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
```
2. 初始容量为指定值的构造方法
```
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
}
}
```
3. 包含指定集合元素的构造方法
```
public ArrayList(Collection extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray() might (incorrectly) not return "this" (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size);
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}
```
五、ArrayList的添加元素方法
1. 添加单个元素
```
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
```
2. 添加多个元素
```
public boolean addAll(Collection extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
```
六、ArrayList的删除元素方法
1. 删除指定元素
```
public boolean remove(Object o) {
int index = indexOf(o);
if (index == -1)
return false;
else
return remove(index);
}
```
2. 删除指定索引的元素
```
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[--size] = null; // Let phaser help GC
return oldValue;
}
```
七、ArrayList的扩容机制
当ArrayList的元素数量达到扩容阈值时,会进行扩容操作。以下是ArrayList的扩容方法:
```
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1) + 1;
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
```
八、总结
本文深入解析了Java ArrayList的源码,包括其核心成员变量、构造方法、添加元素、删除元素和扩容机制。通过阅读本文,读者可以更好地了解ArrayList的内部实现机制,为在实际开发中运用ArrayList提供帮助。






