对于Java初学者来说,集合框架是迈向企业级开发的第一道门槛。不同于数组的固定长度,集合提供了灵活的数据存储方案。本文将带你从零开始,彻底搞懂Collection顶层接口和List接口的核心用法、易错点以及面试高频考点,配合完整代码注释,让你边学边练,快速上手。
一、前置知识:为什么需要集合?
在深入集合之前,我们先回顾一下数组的痛点:
- 长度固定:一旦创建,无法动态扩容
- 类型单一:只能存储同一种类型的数据
- 操作繁琐:增删元素需要手动移动数据
集合就是为了解决这些问题而生的。在Java、JavaScript、Python等主流编程语言中,集合都是核心的数据结构。而在Java中,Collection是所有单列集合的顶层接口,理解它就相当于掌握了List、Set等家族的基础。

个人主页:黎雁
作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、数据结构与算法(JAVA)、游戏、规划、程序人生
✨ 从来绝巘须孤往,万里同尘即玉京

文章摘要:本文适合Java零基础、正在学习ArrayList/LinkedList、以及准备面试或考试的同学。你将学会Collection接口的6个核心方法、List接口的3大特征、索引操作的4个独有方法,以及两个remove方法的重载陷阱。全文包含完整代码和逐行注释,帮助你快速入门与复习。
单列集合最核心基础,吃透顶层接口,后面学 Set、Map 都轻松!

二、Collection接口:单列集合的基石
1. 概述
Collection 是Java集合框架中所有单列集合的顶层接口。无论是List还是Set,都直接或间接继承自它。由于它是一个接口,我们不能直接创建它的实例,而是通过多态的方式使用其实现类,比如ArrayList或LinkedList。这种设计模式在TypeScript、C++等语言中也很常见,体现了面向接口编程的思想。
2. 常用成员方法
下表列出了Collection接口最常用的6个方法,是面试和日常开发中的高频考点:
| 方法名 | 说明 |
|---|---|
| 向集合尾部添加元素 e | |
| 把另一个集合 c 的元素全部添加进来 | |
| 清空集合中所有元素 | |
| 删除集合中 第一个 出现的 obj | |
| 删除当前集合中所有属于 c 的元素 | |
| 只保留当前集合中属于 c 的元素 | |
| 判断集合是否包含某个元素 obj | |
| 判断集合是否为空 | |
| 获取集合中元素个数 |
3. 代码示例与逐行注释
下面通过一个完整的代码示例来演示这些方法的使用:
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo01 {
public static void main(String[] args) {
// Collection 是接口,不能直接 new,使用多态
Collection<String> coll = new ArrayList<>();
// 1. add 添加元素
// List 集合永远返回 true(允许重复)
// Set 集合重复则返回 false(不允许重复)
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
System.out.println(coll); // [aaa, bbb, ccc]
// 2. clear 清空集合
// coll.clear();
// 3. remove 删除元素
// Collection 只能根据 **对象** 删除,不能按索引删
// 存在返回 true,不存在返回 false
coll.remove("aaa");
System.out.println(coll); // [bbb, ccc]
// 4. contains 判断是否包含
// 底层依赖 equals()
// 存自定义对象必须重写 equals,否则按地址比较
boolean contains1 = coll.contains("bbb"); // true
boolean contains2 = coll.contains("aaa"); // false
System.out.println(contains1);
System.out.println(contains2);
// 5. isEmpty 判断是否为空
boolean empty = coll.isEmpty(); // false
System.out.println(empty);
// 6. size 获取元素个数
int size = coll.size(); // 2
System.out.println(size);
}
}
4. 关键细节 ⚠️
- 不能按索引删除:因为Collection是所有单列集合的顶层接口,而Set等子接口没有索引,所以Collection没有定义索引相关的操作。
- contains依赖equals():当存储自定义对象时,必须重写equals()方法,否则默认使用Object的地址比较,会导致contains永远返回false。这一点与JavaScript中的对象比较类似,但Java更严格。
- add返回值差异:对于List,add永远返回true(允许重复);对于Set,如果元素已存在则返回false,否则返回true。
三、List接口:有序、有索引、可重复
1. List概述
List 继承自 Collection ,因此它拥有Collection的所有方法。List的三大特征如下:
- 有序:元素的存储顺序与取出顺序一致
- 有索引:可以通过索引(从0开始)快速访问元素
- 可重复:允许存储相同的元素
这些特性使得List非常适合需要频繁按位置访问的场景,比如实现队列、栈等数据结构。在Python中,List也提供了类似的功能,但Java的List更强调类型安全。
2. List独有的索引方法
因为List支持索引,所以多了以下4个高频方法:
| 方法名 | 说明 |
|---|---|
| 在指定索引 index 处插入元素 | |
| 删除指定索引处元素,返回被删除元素 | |
| 修改指定索引处元素,返回被修改元素 | |
| 获取指定索引处的元素 |
3. 代码示例与易错点
下面通过代码演示索引操作,并重点讲解容易出错的点:
import java.util.ArrayList;
import java.util.List;
public class ListDemo01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list); // [aaa, bbb, ccc]
// 1. 指定索引添加
list.add(1, "QQQ");
System.out.println(list); // [aaa, QQQ, bbb, ccc]
// 2. remove 根据索引删除元素
// 返回被删除的元素
String removed = list.remove(0);
System.out.println("被删除的元素:" + removed); // aaa
System.out.println(list); // [QQQ, bbb, ccc]
// ==============================================
// ⚠️ 重点坑点:两个 remove 方法的重载问题
List<Integer> list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(3);
// list2.remove(1);
// 这里会调用 remove(int index),不是自动装箱!
// 方法重载:优先调用参数类型完全匹配的方法
// 正确删除元素 1 的写法:手动装箱
Integer target = Integer.valueOf(1);
list2.remove(target);
System.out.println(list2); // [2, 3]
// ==============================================
// 3. set 修改指定索引元素
// 返回被覆盖的旧元素
String oldVal = list.set(0, "aaa");
System.out.println("被修改的元素:" + oldVal); // QQQ
System.out.println(list); // [aaa, bbb, ccc]
// 4. get 获取指定索引元素
String s = list.get(2);
System.out.println("索引2的元素:" + s); // ccc
}
}
4. 两个remove方法的区别 ⚠️
这是面试中经常考察的陷阱,也是日常开发中容易踩的坑:
E remove(int index):按索引删除,返回被删除的元素boolean remove(Object o):按元素删除,返回是否删除成功(boolean)
重点坑点:当调用 list.remove(1) 时,由于方法重载,编译器会优先匹配 remove(int index) 方法,而不会进行自动装箱。也就是说,如果你想删除元素值1(Integer类型),直接传入1会调用按索引删除的方法。正确的做法是手动装箱:
list.remove(Integer.valueOf(1));
这个陷阱在TypeScript中不会出现,因为TypeScript没有方法重载的概念,但在Java中必须牢记。建议在开发中始终使用Integer.valueOf()或直接传入Integer对象,避免歧义。
[AFFILIATE_SLOT_1]四、核心知识点总结(速记版)
- Collection:单列集合顶层接口,不能直接实例化,使用多态。核心方法:add、remove、contains、clear、isEmpty、size。contains依赖equals,自定义对象必须重写equals。
- List:继承Collection,特点是有序、有索引、可重复。独有方法:add(index, element)、remove(index)、set(index, element)、get(index)。
- remove重载陷阱:删除数字元素时必须手动装箱,否则会调用按索引删除的方法。
掌握这些,你就能顺利进入ArrayList、LinkedList、Vector以及Set、Map的学习。集合是Java基础的重中之重,建议多敲代码、多记细节。在C++中,STL的vector和list也提供了类似的功能,但Java的集合框架更加统一和易用。
[AFFILIATE_SLOT_2]五、写在最后
Collection与List是Java集合体系的基石。Collection定义了所有单列集合的通用行为,List则定义了有序、可重复、有索引的集合规范。掌握今天的内容,你就能顺畅地学习ArrayList、LinkedList、Vector以及后续的Set、Map系列。集合是Java基础中的重中之重,建议多敲代码、多记细节。如果你有任何疑问,欢迎在评论区留言讨论!
觉得本文清晰、细节足、适合初学者,欢迎 点赞 收藏 关注,后续持续更新 Java 集合系列高质量博客!
public boolean add(E e)public boolean addAll(Collection<? extends E> c)public void clear()public boolean remove(Object obj)public boolean removeAll(Collection<?> c)public boolean retainAll(Collection<?> c)public boolean contains(Object obj)public boolean isEmpty()public int size()public void add(int index, E element)public E remove(int index)public E set(int index, E element)public E get(int index)
浙公网安备 33010602011771号