一、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 替代数组(除非元素数量固定)。
-
所有评论(0)