集合框架概览
集合是存储和操作数据的核心工具,本课学习Java集合框架的整体结构。
为什么需要集合
数组有固定大小的限制,集合可以动态增长。
数组 vs 集合
| 特性 | 数组 | 集合 |
|---|---|---|
| 大小 | 固定 | 动态 |
| 类型 | 基本类型/对象 | 只能对象 |
| 方法 | 无 | 丰富的方法 |
| 泛型 | 不支持 | 支持 |
集合框架体系
TEXT
Collection(接口)
├── List(接口)— 有序,可重复
│ ├── ArrayList(实现类)
│ ├── LinkedList(实现类)
│ └── Vector(实现类)
├── Set(接口)— 无序,不重复
│ ├── HashSet(实现类)
│ ├── TreeSet(实现类)
│ └── LinkedHashSet(实现类)
└── Queue(接口)— 队列
├── LinkedList(实现类)
└── PriorityQueue(实现类)
Map(接口)— 键值对
├── HashMap(实现类)
├── TreeMap(实现类)
├── LinkedHashMap(实现类)
└── Hashtable(实现类)
Collection接口
Collection是所有单值集合的父接口。
常用方法
| 方法 | 说明 | 返回值 |
|---|---|---|
add(E e) |
添加元素 | boolean |
remove(Object o) |
删除元素 | boolean |
contains(Object o) |
是否包含 | boolean |
isEmpty() |
是否为空 | boolean |
size() |
元素数量 | int |
clear() |
清空 | void |
toArray() |
转数组 | Object[] |
示例:Collection基本操作
JAVA
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
// 添加元素
collection.add("Alice");
collection.add("Bob");
collection.add("Charlie");
System.out.println("集合:" + collection); // [Alice, Bob, Charlie]
// 判断
System.out.println("是否包含Alice:" + collection.contains("Alice")); // true
System.out.println("集合大小:" + collection.size()); // 3
System.out.println("是否为空:" + collection.isEmpty()); // false
// 删除
collection.remove("Bob");
System.out.println("删除后:" + collection); // [Alice, Charlie]
// 转数组
Object[] array = collection.toArray();
for (Object obj : array) {
System.out.println(obj);
}
// 清空
collection.clear();
System.out.println("清空后大小:" + collection.size()); // 0
}
}
Iterable与Iterator
Iterable接口
实现了Iterable的类可以用for-each遍历。
Iterator接口
迭代器,用于遍历集合。
| 方法 | 说明 |
|---|---|
hasNext() |
是否有下一个元素 |
next() |
获取下一个元素 |
remove() |
删除当前元素 |
示例:使用Iterator
JAVA
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 方式1:for-each
for (String name : names) {
System.out.println(name);
}
// 方式2:Iterator
Iterator<String> it = names.iterator();
while (it.hasNext()) {
String name = it.next();
System.out.println(name);
}
// 方式3:Iterator删除元素
Iterator<String> it2 = names.iterator();
while (it2.hasNext()) {
String name = it2.next();
if (name.startsWith("B")) {
it2.remove(); // 安全删除
}
}
System.out.println("删除后:" + names); // [Alice, Charlie]
}
}
⚠️ 注意: 遍历时删除元素要用Iterator的remove方法,不能用集合的remove方法,否则会抛出ConcurrentModificationException。
List接口
有序集合,元素可重复。
特点
| 特点 | 说明 |
|---|---|
| 有序 | 元素按插入顺序排列 |
| 可重复 | 可以有相同元素 |
| 索引访问 | 通过索引访问元素 |
常用方法
| 方法 | 说明 |
|---|---|
get(int index) |
获取指定索引的元素 |
set(int index, E e) |
设置指定索引的元素 |
add(int index, E e) |
在指定位置插入 |
remove(int index) |
删除指定索引的元素 |
indexOf(Object o) |
查找元素索引 |
subList(int from, int to) |
截取子列表 |
Set接口
无序集合,元素不可重复。
特点
| 特点 | 说明 |
|---|---|
| 无序 | 元素没有固定顺序 |
| 不重复 | 自动去重 |
| 无索引 | 不能通过索引访问 |
Map接口
键值对集合,键不可重复。
特点
| 特点 | 说明 |
|---|---|
| 键值对 | 每个元素包含键和值 |
| 键不重复 | 键唯一,值可重复 |
| 无序 | HashMap无序 |
常用方法
| 方法 | 说明 |
|---|---|
put(K k, V v) |
添加键值对 |
get(K k) |
根据键获取值 |
remove(K k) |
删除键值对 |
containsKey(K k) |
是否包含键 |
keySet() |
所有键的集合 |
values() |
所有值的集合 |
entrySet() |
所有键值对的集合 |
集合选择指南
| 需求 | 选择 |
|---|---|
| 有序,可重复 | ArrayList |
| 无序,不重复 | HashSet |
| 有序,不重复 | LinkedHashSet |
| 排序,不重复 | TreeSet |
| 键值对 | HashMap |
| 排序键值对 | TreeMap |
❓ 常见问题
Q ArrayList和LinkedList怎么选?
A 查询多用ArrayList,增删多用LinkedList。一般用ArrayList。
Q HashSet去重原理是什么?
A 先比较hashCode,再比较equals。两个都相同才认为是重复元素。
Q HashMap和Hashtable有什么区别?
A HashMap线程不安全但性能高,Hashtable线程安全但性能低。推荐用HashMap。
📖 小节
- 集合框架分为Collection和Map两大体系
- List有序可重复,Set无序不重复,Map键值对
- Iterator用于遍历集合
- 根据需求选择合适的集合类型
📝 作业
- 集合操作: 创建ArrayList,添加10个元素,遍历并删除偶数
- 去重练习: 将数组中的重复元素去除(用HashSet)
- Map练习: 统计字符串中每个字符出现的次数
下一课
下一课我们将学习 List与ArrayList,了解List的详细用法。



