Java 集合框架:ArrayList 的介绍、使用、原理与源码解析
一、ArrayList 的介绍
ArrayList
是 Java 集合框架中的一个动态数组实现,提供了可变大小的数组。它能够存储重复的元素并允许快速随机访问。与原始数组不同,ArrayList
可以动态扩展,允许在运行时在列表中添加或删除元素。
ArrayList
实现了 List
接口,常用的构造函数包括:
- ArrayList()
:创建一个空的列表,初始容量为 10。
- ArrayList(int initialCapacity)
:创建一个空的列表,指定初始容量。
- ArrayList(Collection<? extends E> c)
:创建一个包含指定集合元素的列表。
二、ArrayList 的使用
使用 ArrayList
非常简单,以下是一个基本示例:
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
// 创建 ArrayList
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.add("Apple");
list.add("Banana");
list.add("Cherry");
// 打印列表
System.out.println("初始列表: " + list);
// 插入元素
list.add(1, "Orange");
System.out.println("插入后的列表: " + list);
// 获取元素
String fruit = list.get(2);
System.out.println("索引 2 的元素: " + fruit);
// 删除元素
list.remove("Banana");
System.out.println("删除后的列表: " + list);
// 遍历列表
for (String item : list) {
System.out.println(item);
}
}
}
三、原理分析
ArrayList
的底层是一个数组,通过维护一个 Object
数组来存储元素。默认情况下,ArrayList
的初始容量为 10,当元素数量超过当前容量时,会自动扩展。
扩容的过程是通过创建一个新的更大的数组,并将原有数组的数据复制到新数组中,具体实现方式常见的是在原来的容量基础上乘以 1.5。
当我们向 ArrayList
添加元素时,如果当前数组已满,扩容操作的性能成本是 O(n)。
四、源码解析
ArrayList
的主要源码部分可以在 java.util.ArrayList
类中找到。这是它的核心属性:
transient Object[] elementData; // 存储元素的数组
private int size; // 存储元素的个数
当添加元素时,ArrayList
会检查 size
是否已达到 elementData
的长度:
public boolean add(E e) {
ensureCapacity(size + 1); // 确保容量
elementData[size++] = e; // 添加元素并更新 size
return true;
}
ensureCapacity
方法会调用如下:
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);
}
结论
ArrayList
是 Java 中使用最广泛的集合类之一。它通过动态数组提供了灵活的存储方式,适用于频繁的插入和删除操作。了解其实现原理和源码,能够帮助开发者在选择合适的数据结构时做出明智的决策。