JavaSE从0到1-DAY9-ArrayList
·
Java ArrayList 学习笔记
一、这一章在讲什么
这一章主要学习的是 Java 里的 ArrayList 集合,也就是一种长度可变的容器。
它和数组很像,都能存一组数据,但数组长度固定,而 ArrayList 更灵活。
这一章重点是学会 ArrayList 的创建方式、泛型写法,以及常见的增删改查操作。
另外还提到了一个重要限制:集合里只能存引用数据类型,不能直接存基本数据类型,所以会用到包装类。
这章属于集合入门,核心目标不是研究底层,而是先把最常用的基本操作用熟。
二、核心概念
1. 集合是什么
- 它是什么
集合是一种用于存储多个数据的容器,ArrayList是最常见的一种集合。 - 有什么作用(为什么引入这个概念?)
数组虽然也能存多个数据,但长度一旦定义就不能改。集合解决的就是“数据个数不确定”时不方便的问题。 - 它的原理(怎么实现的?)
这一章先把它理解成一个能自动管理元素个数的容器即可。你往里面加数据、删数据,集合会帮你维护当前内容。 - 初学者容易混淆的点
集合不是数组,但它们都能存多个元素。最关键区别是:数组长度固定,ArrayList长度可变。
2. ArrayList
- 它是什么
ArrayList是 Java 提供的一个集合类。 - 有什么作用
用来按顺序存储一批数据,适合做“增删改查”。 - 它的原理
它会记录每个元素的位置(索引),所以你可以通过索引取值、改值、删值。 - 初学者容易混淆的点
ArrayList的“长度”不是固定容量,而是当前有多少个元素,通常通过size()获取。
3. 泛型
- 它是什么
泛型就是写在尖括号里的类型,例如ArrayList<String>中的<String>。 - 有什么作用
用来限制集合里能存什么类型的数据,避免乱放。 - 它的原理
编译器会根据泛型检查你放进去的数据类型是否一致。 - 初学者容易混淆的点
<String>限制的是集合中的元素类型,不是限制变量名,也不是限制集合对象本身。
示例:
ArrayList<String> list = new ArrayList<>();
list.add("aaa"); // 对
// list.add(123); // 错,因为这里限制的是 String
4. 包装类
- 它是什么
包装类就是把基本数据类型“包装成对象”的类。 - 有什么作用
因为集合里只能放引用数据类型,所以如果想在集合里存整数、小数、字符这些基本类型,就要用对应包装类。 - 它的原理
例如int对应Integer,char对应Character。本质上是“把基本类型变成对象后再存进集合”。 - 初学者容易混淆的点
int和Integer不是一回事:int是基本数据类型Integer是引用数据类型(类)
常见对应关系:
int -> Integerchar -> Characterboolean -> Booleandouble -> Double
5. 索引
- 它是什么
索引就是元素的位置编号,从0开始。 - 有什么作用
可以通过索引精确获取、修改、删除某个位置的数据。 - 它的原理
第一个元素索引是0,第二个是1,依次递增。 - 初学者容易混淆的点
插入、获取、修改、删除的索引范围不完全一样,这一点很容易写错。
三、重难点
1. ArrayList 和数组最大的区别是长度是否可变
- 结论
数组长度固定,ArrayList长度可变。 - 原因
数组一旦创建,长度就定死了;ArrayList可以随着元素的增加和删除动态变化。 - 通俗比喻或小例子
数组像固定格子的快递柜,格子数一开始就定死;ArrayList像可调整容量的收纳盒,用的时候更灵活。
2. 泛型是用来限制集合里元素类型的
- 结论
ArrayList<String>表示这个集合里只能放String。 - 原因
不加泛型时,集合里理论上什么都能放,后面取数据会很乱。加了泛型后,数据类型统一,更安全。 - 通俗比喻或小例子
泛型就像给盒子贴标签:“这里只能放书”,那你就不能往里塞水果。
3. 集合不能直接存基本数据类型,要用包装类
- 结论
存整数用Integer,不能直接写int。 - 原因
ArrayList里存的是引用数据类型,而int、double这些是基本数据类型,不是对象。 - 通俗比喻或小例子
集合像一个“只接收盒装物品”的货架,基本类型像“散装物品”,得先装盒(包装类)才能放进去。
示例:
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
4. add(index, e) 的索引范围和 get/set/remove(index) 不一样
- 结论
插入时最大可以到size();获取、修改、删除时最大只能到size() - 1。 - 原因
插入时允许插到最后;但获取、修改、删除必须操作已经存在的位置。 - 通俗比喻或小例子
插入像在队伍里安排一个新位置,可以插到最后一个人的后面;
但取人、改人、删人,必须这个位置上本来就有人。
5. 两个 remove 方法一定要区分清楚
- 结论
remove(E e)是按内容删,remove(int index)是按索引删。 - 原因
它们方法名一样,但删除依据和返回值不同。 - 通俗比喻或小例子
一个是“把叫张三的人删掉”,一个是“把第 2 个位置的人删掉”。
四、代码理解
1. 创建集合对象
ArrayList<String> list = new ArrayList<>();
ArrayList<String>:表示集合里存的是Stringlist:集合对象名new ArrayList<>():创建一个新的集合对象<>:JDK7 开始,后面的泛型类型可以省略,但尖括号不能丢
2. 添加元素
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);
说明:
- 创建一个字符串集合
- 把
"aaa"、"bbb"、"ccc"依次加到末尾 - 最后打印整个集合
3. 按索引插入元素
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add(1, "qqq");
System.out.println(list);
关键理解:
list.add(1, "qqq");表示把"qqq"插入到索引1- 原来索引
1和后面的元素会向后移
输出结果:
[aaa, qqq, bbb, ccc]
4. 删除元素
按内容删除
boolean res = list.remove("bbb");
System.out.println(res);
System.out.println(list);
说明:
- 找到
"bbb"就删除 - 删除成功返回
true - 找不到返回
false
按索引删除
String res = list.remove(0);
System.out.println(res);
System.out.println(list);
说明:
- 删除索引
0的元素 - 返回被删掉的元素
- 如果索引不存在,程序会报错
5. 修改元素
list.set(1, "mmm");
说明:
- 把索引
1位置的元素改成"mmm"
6. 获取元素
String s = list.get(0);
System.out.println(s);
说明:
- 获取索引
0的元素
7. 遍历集合
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
}
关键理解:
i < list.size():控制循环次数list.get(i):依次取出每个元素
语法规则总结:
- 数组看长度用
length - 集合看长度用
size() - 集合取元素用
get(index)
五、易错点
- 把集合写成能存基本数据类型
错误写法:
ArrayList<int> list = new ArrayList<>();
正确写法:
ArrayList<Integer> list = new ArrayList<>();
- 忘记写泛型
虽然有时不写也能运行,但不推荐,因为这样类型不统一,后面很容易混乱。
推荐写法:
ArrayList<String> list = new ArrayList<>();
-
把
size()当成length
数组用的是length,集合用的是size(),这是从数组切换到集合时最常见的错误。 -
索引越界
比如当前集合有 3 个元素:
- 合法已有索引:
0、1、2 - 插入时可到:
3 - 获取 / 修改 / 删除时不能写
3
- 分不清两个
remove
remove("aaa"):按内容删remove(0):按索引删
六、记忆口诀 / 通俗比喻
记忆口诀
- 数组定长,集合变长
- 泛型限类型,数据不乱放
- 集合存对象,基本类型要包装
- 增删改查:
add、remove、set、get - 集合看个数用
size()
通俗比喻
- 数组像固定车位停车场,车位数建好就不能改。
ArrayList像临时可扩展停车区,车多了还能继续安排。- 泛型像门口贴的标签:“这里只能停小汽车”,那卡车就不能进。
- 包装类像把散装物品装进盒子,才能放进统一管理的仓库。
七、应用
ArrayList 在实际开发里非常常见,比如:
- 存一个班级的学生姓名;
- 存购物车里的商品;
- 存搜索结果列表;
- 存用户提交的一批数据。
例如做一个简单学生名单功能时:
ArrayList<String> students = new ArrayList<>();
students.add("张三");
students.add("李四");
students.add("王五");
for (int i = 0; i < students.size(); i++) {
System.out.println(students.get(i));
}
这里的意思就是:
- 用集合存多个学生名字;
- 以后可以继续加人、删人、改名字;
- 因为人数不固定,所以集合比数组更适合。
如果以后要存成绩,也可以写成:
ArrayList<Integer> scores = new ArrayList<>();
这里就用到了包装类 Integer。
八、最终总结
ArrayList 是 Java 中最常用的集合之一,本质上是一个长度可变的容器。
它和数组最大的区别是:数组定长,集合变长。
使用 ArrayList 时要掌握三件事:泛型、增删改查、遍历。
另外要记住:集合里不能直接放基本数据类型,想放整数等数据时,要使用对应的包装类。
这章学会后,后面很多数据存储、遍历、操作集合的代码都会更容易理解。
更多推荐

所有评论(0)