ArrayList
是 Java 中 java.util
包中的一个类,它实现了 List
接口并提供了基于动态数组的列表实现。与 LinkedList
相比,ArrayList
提供了对元素的快速访问(通过索引),但在元素插入和删除时可能会稍慢,尤其是在中间位置。它是最常用的动态数组实现之一,适用于需要频繁访问和较少插入/删除的场景。
以下是 ArrayList
的详细介绍和常见用法:
1. 方法介绍
import java.util.ArrayList;//导入 ArrayList
//无参构
ArrayList<Integer> list = new ArrayList<>(); // 空的 ArrayList,默认容量为 10
//指定初始容量来创建
ArrayList<String> listWithCapacity = new ArrayList<>(20); // 指定初始容量为 20
//add(E e) 添加元素到列表的末尾。
list.add(10); // 添加一个元素
//add(int index, E element)在指定位置插入元素。
list.add(1, 15); // 在索引 1 处插入元素 15
//get(int index)返回指定索引位置的元素
int element = list.get(0); // 获取索引 0 位置的元素
//set(int index, E element):更新指定索引位置的元素,返回旧值。
list.set(0, 100); // 将索引 0 位置的元素更新为 100
//删除元素
//remove(int index):删除指定索引位置的元素,返回被删除的元素。
int removedElement = list.remove(1); // 删除索引 1 位置的元素
//remove(Object o):删除指定元素的第一个匹配项,如果列表中有多个相同的元素,只会删除第一个匹配项。
list.remove(Integer.valueOf(10)); // 删除元素 10
//查找元素
//contains(Object o):检查 `ArrayList` 是否包含指定的元素。
boolean contains = list.contains(20); // 判断列表中是否包含元素 20
//indexOf(Object o):返回指定元素在 `ArrayList` 中的索引,如果不存在返回 `-1`。
int index = list.indexOf(20); // 查找元素 20 在列表中的索引
//获取列表大小
//size():返回 `ArrayList` 中元素的个数。
int size = list.size(); // 获取列表中的元素个数
//clear():清空 `ArrayList` 中的所有元素。
list.clear(); // 清空列表
//isEmpty():检查 `ArrayList` 是否为空
boolean isEmpty = list.isEmpty(); // 判断列表是否为空
//toArray():将 `ArrayList` 转换为数组。
Object[] array = list.toArray(); // 转换为 Object 数组
Integer[] integerArray = list.toArray(new Integer[0]); // 转换为 Integer 类型数组
2. 实验示例
下面是一个简单的 ArrayList
使用示例:
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
// 创建一个 ArrayList
ArrayList<Integer> list = new ArrayList<>();
// 向列表中添加元素
list.add(10);
list.add(20);
list.add(30);
// 输出列表的内容
System.out.println("列表内容: " + list);
// 获取列表中指定位置的元素
System.out.println("索引 1 的元素: " + list.get(1)); // 输出 20
// 更新列表中的元素
list.set(1, 25);
System.out.println("更新后的列表内容: " + list);
// 删除列表中的元素
list.remove(0); // 删除索引 0 的元素
System.out.println("删除后的列表内容: " + list);
// 判断列表中是否包含某个元素
System.out.println("列表是否包含 25: " + list.contains(25)); // 输出 true
// 查找元素在列表中的索引
System.out.println("25 在列表中的索引: " + list.indexOf(25)); // 输出 0
// 获取列表的大小
System.out.println("列表的大小: " + list.size()); // 输出 2
// 清空列表
list.clear();
System.out.println("清空后的列表内容: " + list);
}
}
3. 性能特点
- 添加元素:
add(E e)
是常数时间操作(O(1)
),但如果数组容量不足时,会触发扩容操作,这时会有O(n)
的性能开销。 - 访问元素:
get(int index)
是常数时间操作(O(1)
),由于ArrayList
是基于数组实现的,索引访问非常高效。 - 删除元素:删除操作(
remove()
)的时间复杂度为O(n)
,因为删除元素后需要移动其后的所有元素来填补空缺。 - 动态扩容:
ArrayList
在达到容量上限时,会自动扩容,通常是当前容量的 1.5 倍。扩容的代价是O(n)
。
4. 常见用法
1) 存储自定义对象
ArrayList
不仅能存储基本类型,还能存储自定义对象。例如:
import java.util.ArrayList;
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class PersonArrayList {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("Alice", 30));
list.add(new Person("Bob", 25));
// 输出每个人的信息
for (Person person : list) {
System.out.println(person);
}
}
}
2) 迭代遍历
ArrayList
支持多种遍历方式,如 for
循环、for-each
循环、Iterator
等:
// 通过 for 循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 使用 for-each 循环
for (Integer num : list) {
System.out.println(num);
}
// 使用 Iterator
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
5. 注意
ArrayList
是一个动态数组的实现,提供了快速的索引访问和灵活的大小调整。- 它是基于数组实现的,因此适合需要频繁随机访问的场景。
- 对于插入或删除元素,特别是在中间位置的操作,它的性能较差,因为这些操作可能需要移动大量元素。
- 使用
ArrayList
时,要注意性能开销,尤其是在频繁插入和删除元素时,可以考虑使用LinkedList
替代。