一、ArrayList 核心概念
- 定义:
ArrayList 是 Java 集合框架中 List 接口的实现类,底层基于动态扩容的数组实现,用于存储有序、可重复的元素,支持动态增删改查。 - 核心特点:
- 长度动态可变,超出容量时自动扩容(默认初始容量 10,扩容后为原容量的 1.5 倍);
- 允许存储
null 值,元素有序且可重复; - 访问元素效率高(通过索引直接访问),增删元素(非末尾)效率较低(需移动后续元素);
- 仅支持存储引用数据类型(基本数据类型需使用包装类,如
int→Integer、char→Character)。
- 使用前提:需导入
java.util.ArrayList 包。
二、ArrayList 初始化
1. 空构造(最常用)
import java.util.ArrayList;
// 创建存储String类型的ArrayList
ArrayList<String> list1 = new ArrayList<>();
// 创建存储Integer类型的ArrayList(对应int基本类型)
ArrayList<Integer> list2 = new ArrayList<>();
2. 指定初始容量
适合提前知道元素数量的场景,减少扩容次数,提升性能:
// 初始容量为20的ArrayList
ArrayList<Double> list3 = new ArrayList<>(20);
3. 基于已有集合初始化:
// 基于数组创建ArrayList
ArrayList<String> list4 = new ArrayList<>(Arrays.asList("Java", "Python", "C++"));
三、ArrayList 核心方法(按使用频率排序)
1. 增:添加元素
| 方法 | 作用 | 示例代码 |
|---|
add(E e) | 向列表末尾添加元素 | list.add("Go"); // 列表:[Go] |
add(int index, E e) | 向指定索引位置插入元素(后续元素自动后移) | list.add(1, "PHP"); // 列表:[Go, PHP] |
addAll(Collection c) | 添加另一个集合的所有元素到末尾 | ArrayList<String> list5 = new ArrayList<>(Arrays.asList("JS", "Ruby")); <br> list.addAll(list5); // 列表:[Go, PHP, JS, Ruby] |
2. 删:删除元素
| 方法 | 作用 | 示例代码 |
|---|
remove(int index) | 删除指定索引的元素,返回被删除的元素 | String delElem = list.remove(1); // 删除索引1的PHP,delElem = "PHP" |
remove(Object o) | 删除第一个匹配的元素,返回是否删除成功(boolean) | boolean isDel = list.remove("Go"); // 删除元素Go,isDel = true |
removeIf(Predicate filter) | 按条件删除元素(JDK 8+) | // 删除长度为2的元素 <br> list.removeIf(elem -> elem.length() == 2); |
clear() | 清空所有元素 | list.clear(); // 列表变为空 |
3. 改:修改元素
| 方法 | 作用 | 示例代码 |
|---|
set(int index, E e) | 修改指定索引的元素,返回被替换的旧元素 | String oldElem = list.set(0, "Java"); // 索引0改为Java,oldElem = 原索引0的元素 |
4. 查:获取元素 / 信息
| 方法 | 作用 | 示例代码 |
|---|
get(int index) | 获取指定索引的元素 | String elem = list.get(0); // 获取索引0的元素 |
size() | 获取列表中实际元素个数(区别于数组的 length) | int len = list.size(); // 返回当前元素数量 |
isEmpty() | 判断列表是否为空(等价于 size() == 0) | boolean isEmpty = list.isEmpty(); |
contains(Object o) | 判断列表是否包含指定元素 | boolean hasJava = list.contains("Java"); |
indexOf(Object o) | 返回指定元素第一次出现的索引,不存在则返回 -1 | int index = list.indexOf("Java"); |
lastIndexOf(Object o) | 返回指定元素最后一次出现的索引,不存在则返回 -1 | int lastIndex = list.lastIndexOf("Java"); |
5. 其他常用方法
| 方法 | 作用 | 示例代码 |
|---|
toArray() | 将 ArrayList 转为数组 | Object[] arr = list.toArray(); |
toArray(T[] a) | 转为指定类型的数组(推荐) | String[] strArr = list.toArray(new String[0]); |
sort(Comparator c) | 自定义排序(JDK 8+) | // 按字符串长度升序排序 <br> list.sort((s1, s2) -> s1.length() - s2.length()); |
四、完整示例代码
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListCoreDemo {
public static void main(String[] args) {
// 1. 初始化
ArrayList<String> langList = new ArrayList<>();
// 2. 添加元素
langList.add("Java"); // 末尾添加
langList.add("Python");
langList.add(1, "Go"); // 索引1插入
System.out.println("添加后:" + langList); // [Java, Go, Python]
// 3. 获取元素/信息
System.out.println("元素个数:" + langList.size()); // 3
System.out.println("索引0的元素:" + langList.get(0)); // Java
System.out.println("是否包含Python:" + langList.contains("Python")); // true
System.out.println("Go的索引:" + langList.indexOf("Go")); // 1
// 4. 修改元素
String oldElem = langList.set(2, "C++");
System.out.println("修改后:" + langList); // [Java, Go, C++]
System.out.println("被替换的元素:" + oldElem); // Python
// 5. 删除元素
langList.remove(1); // 删除索引1的Go
System.out.println("删除索引1后:" + langList); // [Java, C++]
langList.remove("C++"); // 删除元素C++
System.out.println("删除元素C++后:" + langList); // [Java]
// 6. 清空&判断空
langList.clear();
System.out.println("是否为空:" + langList.isEmpty()); // true
}
}
五、注意事项
- 索引越界问题:调用
get(int index)、remove(int index)、add(int index, E e) 时,索引需满足 0 ≤ index ≤ size(),否则抛出 IndexOutOfBoundsException。 - 基本类型存储:不能直接存储
int、char 等基本类型,需使用包装类(Integer、Character),JDK 5+ 自动装箱 / 拆箱,无需手动转换: - 遍历方式:
- 普通 for 循环:适合需要索引的场景;
- 增强 for 循环(foreach):仅遍历元素;
- 迭代器(Iterator):支持遍历中删除元素(避免
ConcurrentModificationException)。
-
总结
ArrayList 是动态数组,核心优势是动态增删元素,提供了丰富的操作方法;- 高频方法:
add()(增)、remove()(删)、set()(改)、get()(查)、size()(获取长度); - 注意索引越界、基本类型需用包装类,日常开发中优先使用
ArrayList 替代数组(除非元素数量固定)。 -