所属包:
java.util;集合只存引用类型,基本数据类型要使用包装类 虚线框 = 接口,实线框 = 实现类
一、集合概述
1. 集合是什么
集合是 Java 提供的容器,用来存储、管理多个对象,长度可变。 数组也是容器,集合就是为了弥补数组的短板。
2. 数组 vs 集合对比
| 对比项 | 数组 | 集合 |
|---|---|---|
| 长度 | 固定,创建后不能修改 | 可变,自动扩容 |
| 存储内容 | 可以存基本类型、引用类型 | 只能存引用类型(存基本类型会自动装箱) |
| 存储类型 | 同一数组只能存同一种类型 | 可以指定泛型,限制类型;不指定默认存 Object |
| 自带方法 | 方法很少,只有 length 属性 | 大量现成增删改查方法,功能强大 |
3. 集合核心继承体系
- 单列集合:Collection (一次存一个元素)
- List(子接口)→ 实现类:
ArrayList、LinkedList、Vector - Set(子接口)→ 实现类:
HashSet、LinkedHashSet、TreeSet
- List(子接口)→ 实现类:
- 双列集合:Map (一次存一对键值对 key-value)
- 实现类:
HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
- 实现类:
4. 集合四大核心接口
| 接口 | 描述 |
|---|---|
| Collection | 集合中最基本的接口,一般不直接使用该接口 |
| List | Collection 的子接口,存储有序、可重复对象,常用接口 |
| Set | Collection 的子接口,存储**无序、唯一(不可重复)**对象 |
| Map | 存储一组键值对,提供 key 到 value 的映射关系 |
✅ 纠正 PPT 文字错误:PPT 写 List "无序" 是写错了,List 是有序、带索引!
二、Collection 接口(单列集合顶层接口)
Collection 是所有单列集合的顶层接口,List、Set 都继承它;接口不能 new,只能用实现类 + 多态写法。
✅ PPT 列出基础方法
| 方法声明 | 功能描述 |
|---|---|
boolean add(Object o) |
向集合中添加一个元素 |
boolean addAll(Collection c) |
将指定集合 c 里所有元素添加到当前集合 |
void clear() |
删除集合中所有元素,清空集合 |
boolean remove(Object o) |
删除集合中指定的元素 |
boolean removeAll(Collection c) |
删除当前集合中,同时存在于集合 c 里的元素(差集) |
✅ 补充剩余常用 Collection 方法(完整版本)
| 方法声明 | 功能描述 |
|---|---|
boolean contains(Object o) |
判断集合是否包含指定元素 |
boolean containsAll(Collection c) |
判断当前集合是否包含集合 c 全部元素 |
boolean retainAll(Collection c) |
保留两个集合的交集,删掉其他元素 |
int size() |
获取集合内元素个数 |
boolean isEmpty() |
判断集合是否为空(元素数量为 0) |
Object[] toArray() |
集合转为 Object 数组 |
<T> T[] toArray(T[] a) |
集合转为指定泛型数组 |
代码示例(多态,ArrayList 演示)
import java.util.ArrayList;
import java.util.Collection;
public class TestCollection {
public static void main(String[] args) {
// 多态写法:父接口引用指向子类对象
Collection<String> coll = new ArrayList<>();
// add 添加
coll.add("张三");
coll.add("李四");
coll.add("王五");
System.out.println(coll); // [张三, 李四, 王五]
Collection<String> coll2 = new ArrayList<>();
coll2.add("李四");
coll2.add("赵六");
// addAll 批量添加
coll.addAll(coll2);
System.out.println(coll);
// remove 删除单个元素
coll.remove("王五");
System.out.println(coll);
// removeAll 删除交集元素
coll.removeAll(coll2);
System.out.println(coll);
// size、contains、isEmpty
System.out.println(coll.contains("张三"));
System.out.println(coll.size());
System.out.println(coll.isEmpty());
// clear 清空全部元素
coll.clear();
System.out.println(coll.isEmpty());
}
}
三、Collection 通用遍历方式
-
迭代器 Iterator:单列集合通用遍历,Set 无索引优先用迭代器
-
增强 for 循环(for-each):底层封装迭代器,写法简洁
for(元素类型 变量 : 集合/数组){
System.out.println(变量);
} -
JDK8
forEach+ Lambda 表达式(之前 Lambda 知识点,整合进来)coll.forEach( s -> System.out.println(s) );
四、重点易错点总结
- 虚线 = 接口,实线 = 实现类;Collection、List、Set、Map 都是接口,不能直接 new
- List:有序、带索引、元素可重复 ;Set:无序、无索引、元素不可重复
remove(Object o):Collection 层面是按元素对象删除,不是索引;只有 List 才有按索引删除的重载方法clear()只是清空里面元素,集合对象本身还存在,不是变成 null- 集合存储的是对象地址,不是对象本身;泛型用来限定存储类型,避免类型转换异常
- Map 是双列集合,不属于 Collection 分支,和 Collection 是平级两大分支
五、小节小结
- 集合分两大分支:单列 Collection、双列 Map
- Collection 是单列集合根接口,定义所有单列集合通用增删查方法
- 单列集合遍历:迭代器、增强 for、forEach+Lambda