在 Java 中,当我们需要存储多个数据时,数组虽然能用,但固定长度的特性往往不够灵活 —— 比如想动态添加或删除元素时,数组就显得力不从心。这时,ArrayList作为最常用的集合类之一,就能完美解决这个问题。今天这篇文章,我们就从基础出发,结合实例聊聊ArrayList的核心特性、创建方式以及必备操作,帮你快速上手这个 “动态数组”。
一、为什么需要 ArrayList?
先想想数组的痛点:假设你定义了一个长度为 3 的数组String[] arr = new String[3],当你想存第 4 个元素时,只能重新创建一个更长的数组,把原有元素复制过去 —— 这操作不仅麻烦,还浪费内存。
而ArrayList本质是一个 “动态数组”,它的长度可以自动扩容,我们无需关心底层如何实现,只需调用方法就能轻松添加、删除元素。简单说,ArrayList 就是为 “动态管理一组数据” 而生的。
它的优势很明显:
- 长度可变,无需手动扩容
- 提供了丰富的方法操作元素(增删改查一键搞定)
- 支持泛型,能限定存储的数据类型(避免类型混乱)
二、ArrayList 的创建:泛型是关键
创建ArrayList的语法很简单,但泛型的使用是核心—— 它能规定集合中只能存某种类型的元素,避免运行时出现类型错误。
基本语法:
// 完整写法:指定泛型类型(存储String类型元素)
ArrayList<String> list = new ArrayList<String>();
// 简化写法(JDK 7+支持):后面的泛型可省略
ArrayList<String> list = new ArrayList<>();
注意点:
- 泛型只能写引用类型(如
String、Integer),不能写基本类型(如int、double)。如果要存整数,可用ArrayList<Integer>。 - 创建后直接打印
list,会显示元素内容(如[]表示空集合),而不是地址值 —— 这是 Java 对集合类的特殊处理,方便调试。
三、ArrayList 核心操作:CRUD 一站式掌握
ArrayList的常用方法围绕 “增删改查(CRUD)” 展开,我们结合实例一个个讲清楚:
1. 增:添加元素(add())
boolean add(E e):向集合末尾添加元素,返回true(几乎永远成功,可忽略返回值)。
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list); // 输出:[aaa, bbb, ccc]
如果想在指定位置插入元素,可用add(int index, E e):
list.add(1, "xxx"); // 在索引1的位置插入"xxx"
System.out.println(list); // 输出:[aaa, xxx, bbb, ccc]
2. 删:删除元素(remove())
有两种删除方式,根据场景选择:
-
按元素删除:
boolean remove(E e)
删除第一个匹配的元素,返回是否删除成功(存在则删除并返回true,否则false)。// 删除"xxx" boolean isRemoved = list.remove("xxx"); System.out.println(isRemoved); // 输出:true System.out.println(list); // 输出:[aaa, bbb, ccc] -
按索引删除:
E remove(int index)
删除指定索引的元素,返回被删除的元素(需注意索引越界问题)。// 删除索引0的元素 String removed = list.remove(0); System.out.println(removed); // 输出:aaa(被删除的元素) System.out.println(list); // 输出:[bbb, ccc]
3. 改:修改元素(set())
E set(int index, E e):修改指定索引的元素,返回被替换的旧元素。
// 将索引0的元素改为"ddd"
String old = list.set(0, "ddd");
System.out.println(old); // 输出:bbb(被替换的旧元素)
System.out.println(list); // 输出:[ddd, ccc]
4. 查:查询元素(get() + size())
E get(int index):获取指定索引的元素。int size():获取集合的长度(元素个数)。
结合循环遍历所有元素:
// 遍历集合
for (int i = 0; i < list.size(); i++) {
String element = list.get(i);
System.out.println(element);
}
// 输出:
// ddd
// ccc
四、ArrayList 的注意事项
-
索引越界问题:
调用get(index)、remove(index)、set(index)时,若index超出[0, size-1]范围,会抛出IndexOutOfBoundsException。务必注意循环中索引的边界(用size()判断)。 -
泛型的好处:
若不指定泛型(如ArrayList list = new ArrayList()),集合可以存任意类型元素,容易出现ClassCastException(类型转换异常)。建议始终指定泛型,比如ArrayList<Integer>存整数,ArrayList<Student>存自定义对象。 -
与数组的转换:
若需要将ArrayList转为数组,可用toArray()方法:String[] arr = list.toArray(new String[0]); // 转为String数组
五、什么时候用 ArrayList?
- 需要动态添加 / 删除元素时(替代固定长度的数组)。
- 频繁查询元素(
get(index)效率高,底层是数组实现,随机访问快)。 - 存储一组同类型数据(通过泛型约束)。
比如:存储用户列表、商品列表、成绩记录等场景,ArrayList都是首选。
六、总结
ArrayList作为 Java 中最基础的集合类,核心价值在于 “动态管理数据”。本文从创建方式(泛型的重要性)讲到 CRUD 操作(增删改查的具体方法),再到实际使用的注意事项,覆盖了初学者必备的知识点。
建议多动手练习:比如用ArrayList实现一个简单的 “学生管理系统”,包含添加学生、删除学生、查询所有学生等功能,通过实战加深理解。
2667

被折叠的 条评论
为什么被折叠?



