Java ArrayList 源码解析:深入剖析Java集合框架中的明星角色

一、引言
Java ArrayList 是Java集合框架中非常常见的实现之一,主要用于存储一组对象,其底层是基于数组实现的。ArrayList 是一个可变大小的数组实现,它允许用户添加、删除、修改和访问列表中的元素。在本文中,我们将深入剖析Java ArrayList 的源码,理解其内部实现和设计原理。
二、ArrayList 的基本结构
ArrayList 的核心数据结构是一个 Object 数组,用于存储元素。当需要增加元素时,如果数组已满,ArrayList 会创建一个新的更大的数组,并将旧数组的内容复制到新数组中。以下是 ArrayList 的基本结构:
1. 元素类型:ArrayList 存储元素的类型是 E,它可以是任何非基本数据类型。
2. 元素数:ArrayList 中的元素数量,从 0 开始。
3. 容量:ArrayList 的容量是数组的长度。
4. 元素数组:用于存储元素的 Object 数组。
三、ArrayList 的构造方法
1. 无参构造方法:创建一个默认的空列表,初始容量为 10。
```java
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
```
2. 有参构造方法:根据指定的初始容量创建一个空的列表。
```java
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. 有参构造方法(根据集合创建):根据指定的集合创建一个新的 ArrayList。
```java
public ArrayList(Collection extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray() might (incorrectly) not include the last element
if (elementData[size - 1] == null) {
elementData = Arrays.copyOf(elementData, size);
}
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}
```
四、ArrayList 的主要方法
1. add(E e):添加元素到 ArrayList 的末尾。
```java
public boolean add(E e) {
modCount++;
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
```
2. remove(int index):删除指定索引处的元素。
```java
public E remove(int 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; // clear to let GC do its work
return oldValue;
}
```
3. set(int index, E element):将指定索引处的元素替换为指定的元素。
```java
public E set(int index, E element) {
if (index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
```
4. get(int index):返回指定索引处的元素。
```java
public E get(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
return elementData(index);
}
```
五、总结
本文深入剖析了 Java ArrayList 的源码,包括其基本结构、构造方法以及主要方法。通过分析源码,我们可以更好地理解 ArrayList 的内部实现和设计原理,为我们在实际开发中更好地使用 ArrayList 提供了帮助。在后续的文章中,我们将继续探讨 Java 集合框架中的其他重要实现,如 LinkedList、HashMap 等。






