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 对应 Integerchar 对应 Character。本质上是“把基本类型变成对象后再存进集合”。
  • 初学者容易混淆的点
    intInteger 不是一回事:
    • int 是基本数据类型
    • Integer 是引用数据类型(类)

常见对应关系:

  • int -> Integer
  • char -> Character
  • boolean -> Boolean
  • double -> Double

5. 索引

  • 它是什么
    索引就是元素的位置编号,从 0 开始。
  • 有什么作用
    可以通过索引精确获取、修改、删除某个位置的数据。
  • 它的原理
    第一个元素索引是 0,第二个是 1,依次递增。
  • 初学者容易混淆的点
    插入、获取、修改、删除的索引范围不完全一样,这一点很容易写错。

三、重难点

1. ArrayList 和数组最大的区别是长度是否可变

  • 结论
    数组长度固定,ArrayList 长度可变。
  • 原因
    数组一旦创建,长度就定死了;ArrayList 可以随着元素的增加和删除动态变化。
  • 通俗比喻或小例子
    数组像固定格子的快递柜,格子数一开始就定死;
    ArrayList 像可调整容量的收纳盒,用的时候更灵活。

2. 泛型是用来限制集合里元素类型的

  • 结论
    ArrayList<String> 表示这个集合里只能放 String
  • 原因
    不加泛型时,集合里理论上什么都能放,后面取数据会很乱。加了泛型后,数据类型统一,更安全。
  • 通俗比喻或小例子
    泛型就像给盒子贴标签:“这里只能放书”,那你就不能往里塞水果。

3. 集合不能直接存基本数据类型,要用包装类

  • 结论
    存整数用 Integer,不能直接写 int
  • 原因
    ArrayList 里存的是引用数据类型,而 intdouble 这些是基本数据类型,不是对象。
  • 通俗比喻或小例子
    集合像一个“只接收盒装物品”的货架,基本类型像“散装物品”,得先装盒(包装类)才能放进去。

示例:

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>:表示集合里存的是 String
  • list:集合对象名
  • 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)

五、易错点

  1. 把集合写成能存基本数据类型

错误写法:

ArrayList<int> list = new ArrayList<>();

正确写法:

ArrayList<Integer> list = new ArrayList<>();
  1. 忘记写泛型
    虽然有时不写也能运行,但不推荐,因为这样类型不统一,后面很容易混乱。

推荐写法:

ArrayList<String> list = new ArrayList<>();
  1. size() 当成 length
    数组用的是 length,集合用的是 size(),这是从数组切换到集合时最常见的错误。

  2. 索引越界
    比如当前集合有 3 个元素:

  • 合法已有索引:0、1、2
  • 插入时可到:3
  • 获取 / 修改 / 删除时不能写 3
  1. 分不清两个 remove
  • remove("aaa"):按内容删
  • remove(0):按索引删

六、记忆口诀 / 通俗比喻

记忆口诀

  • 数组定长,集合变长
  • 泛型限类型,数据不乱放
  • 集合存对象,基本类型要包装
  • 增删改查:addremovesetget
  • 集合看个数用 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 时要掌握三件事:泛型、增删改查、遍历
另外要记住:集合里不能直接放基本数据类型,想放整数等数据时,要使用对应的包装类
这章学会后,后面很多数据存储、遍历、操作集合的代码都会更容易理解。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐