CS61B 课程笔记(Lecture 14 Exceptions, Iterators, Iterables)

列表、集合和数组集合

6.1 列表、集合和数组集合 · Hug61B

  • 列表:数据结构,用于存储元素的有序集合。
  • 集合:存储唯一元素的无序集合。
  • 数组集合:自定义集合类。

6.2 抛出异常 · Hug61B

  • 异常:程序执行中出现的错误,导致控制流停止。
  • 抛出异常:通过 throw 语句手动触发异常。

6.3 迭代 · Hug61B

  • 迭代:遍历集合或列表中的元素。

异常处理

列表和集合的使用

在本节中,我们将学习如何使用 Java 内置的 List 和 Set 数据结构,并构建我们自己的 ArraySet。

示例代码:

1
2
3
4
5
List61B<Integer> L = new AList<>();
L.addLast(5);
L.addLast(10);
L.addLast(15);
L.print();

Java 内置列表

Java 提供了 List 接口和多种实现(如 ArrayList),使用时需实例化实现类。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
import java.util.List;
import java.util.ArrayList;

public class Example {
public static void main(String[] args) {
List<Integer> L = new ArrayList<>();
L.add(5);
L.add(10);
System.out.println(L);
}
}

集合

集合是唯一元素的集合。Java 提供了 Set 接口及其实现(如 HashSet)。

示例代码:

1
2
3
4
5
6
7
import java.util.Set;
import java.util.HashSet;

Set<String> s = new HashSet<>();
s.add("东京");
s.add("拉各斯");
System.out.println(s.contains("东京")); // true

Python 集合

Python 中使用 set() 来创建集合,检查元素是否存在使用 in 关键字。

示例代码:

1
2
3
4
s = set()
s.add("东京")
s.add("拉各斯")
print("东京" in s) # True

自定义 ArraySet

目标是实现一个包含以下方法的 ArraySet:

  • add(value):添加值,如果不存在则添加。
  • contains(value):检查值是否在集合中。
  • size():返回集合的大小。

当前代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Iterator;

public class ArraySet<T> implements Iterable<T> {
private T[] items;
private int size;

public ArraySet() {
items = (T[]) new Object[100];
size = 0;
}

public boolean contains(T x) {
for (int i = 0; i < size; i += 1) {
if (items[i].equals(x)) {
return true;
}
}
return false;
}

public void add(T x) {
if (contains(x)) {
return;
}
items[size] = x;
size += 1;
}

public int size() {
return size;
}
}

抛出异常

NullPointerException

当尝试将 null 添加到 ArraySet 时,contains 方法中的 items[i].equals(x) 会抛出异常。

更新的 add 方法:

1
2
3
4
5
6
7
8
9
10
public void add(T x) {
if (x == null) {
throw new IllegalArgumentException("不能添加 null");
}
if (contains(x)) {
return;
}
items[size] = x;
size += 1;
}

异常处理的好处

  1. 控制程序流:开发者可以决定程序在何时停止。
  2. 提供更有用的异常类型和错误消息。

捕获异常

  • 未捕获的异常:程序崩溃的原因。
  • 检查异常与未检查异常:不同类型的异常处理方式。