第 4 周:常用类 + 异常 + 集合
本周目标
本周从“能写”变成“写现代 Java”。完成后,应能够:
- 使用
String和StringBuilder完成字符串处理 - 使用异常体系处理可预期和不可预期的错误,并定义业务异常
- 使用
ArrayList保存和操作有序数据 - 使用
HashMap完成按学号、按姓名等键值查找 - 使用泛型和增强
for循环编写类型安全的集合代码 - 把数组版的管理系统升级为集合版
学习资料与范围
- 主课程:Java 零基础视频教程(上部)
- 视频范围:P131-P170(String、StringBuilder、异常、ArrayList、HashMap)
| 视频范围 | 学习模块 | 学习结果 |
|---|---|---|
| P131-P138 | String 的创建、常用方法、字符串比较和遍历 | 能够完成字符串查找、截取和格式化 |
| P139-P145 | StringBuilder、字符串拼接和包装类、自动拆装箱 | 能够高效拼接字符串并处理包装类型 |
| P146-P153 | 异常体系、try...catch、throws、throw 和自定义异常 | 能够捕获、抛出和定义异常 |
| P154-P162 | 集合体系、List、ArrayList、泛型和遍历方式 | 能够使用集合替代数组管理数据 |
| P163-P170 | Set 基础、Map、HashMap 的常用方法 | 能够使用键值结构完成快速查找和统计 |
分 P 范围为参考区间,实际以课程章节标题为准。
需要掌握的知识点
字符串
- 字符串常量与
new String()创建对象的区别 ==比较地址与equals()比较内容的区别length()、charAt()、substring()、indexOf()、contains()、replace()、split()、trim()、toUpperCase()等常用方法- 字符串遍历和字符统计
- 字符串不可变的特点,以及大量拼接时的性能问题
- 格式化输出与字符串转换
StringBuilder 与包装类
StringBuilder的创建、追加、插入、删除和反转- 循环拼接场景下
StringBuilder与+的差异 StringBuilder与StringBuffer的区别(了解即可)- 八种基本类型对应的包装类
- 自动装箱和自动拆箱,以及空指针风险
Integer.parseInt()、Integer.valueOf()等常用转换方法
异常
Throwable、Error、Exception、RuntimeException的层次关系- 编译时异常和运行时异常的区别
try...catch、多个catch、finally的执行顺序throws声明异常和throw抛出异常的区别- 异常信息、调用栈和报错定位
- 自定义业务异常,例如
StudentNotFoundException、DuplicateStudentIdException - 异常处理原则:不吞异常、不滥用捕获、给用户可读的提示
try...finally释放资源的写法,为第 5 周的try-with-resources做准备
集合
- 集合与数组的区别及选择依据
Collection、List、Set、Map的层次结构ArrayList的增删改查、按索引访问、遍历和排序- 集合的遍历方式:普通
for、增强for、迭代器 - 在遍历过程中删除元素时的并发修改异常
- 泛型的作用、泛型集合的声明和类型安全
Set的去重特点和基础使用HashMap的键值结构、常用方法、遍历方式- 使用
HashMap实现按学号查学生、统计数量和分组 - 集合元素的排序,
Comparable与Comparator的基础使用
必做练习
- 字符串基础:录入一个字符串,统计字符个数、数字个数、大小写字母个数。
- 字符串处理:实现手机号中间四位脱敏、字符串反转判断回文。
- 字符串比较:分别使用
==和equals()比较两个字符串,输出结果并解释差异。 - 字符串拆分:把
"张三,100,90,80"解析为学生姓名和三门课成绩。 - 拼接性能:分别使用
+和StringBuilder拼接 10000 次字符串,记录耗时差异。 - 包装类转换:把字符串
"100"转为整数并计算;把非法字符串"abc"转为整数,捕获并处理NumberFormatException。 - 异常捕获:分别制造数组越界、空指针和数字格式异常,输出异常类名和异常信息。
- 自定义异常:定义
StudentNotFoundException,在查询不到学生时抛出并在main中捕获输出友好提示。 - 集合基础:使用
ArrayList保存学生姓名,实现添加、删除、修改、查询和遍历。 - 集合去重:把包含重复学号的列表使用
Set去重,输出去重前后的数量。 - 键值查找:使用
HashMap<String, Student>按学号保存学生,实现按学号查找和删除。 - 集合排序:使用
Comparator按总分对学生列表降序排序,总分相同时按学号升序。
本周综合任务:内存版学生信息管理系统
把第 3 周的模型接入集合,完成一个可交互的内存版管理系统。
要求:
- 使用
ArrayList<Student>作为学生数据容器,替换此前的对象数组 - 使用
HashMap<String, Student>建立学号到学生对象的索引,提高查找效率 - 使用控制台菜单实现:新增学生、按学号删除、修改信息、按学号查询、按姓名模糊查询、查看全部、成绩统计
- 新增重复学号时抛出
DuplicateStudentIdException,查询不到时抛出StudentNotFoundException - 对输入的数字格式、空输入和越界选择进行处理,程序不因异常直接退出
- 使用增强
for或迭代器完成遍历,说明遍历中删除元素的正确做法 - 使用泛型声明集合,不出现强制类型转换的集合代码
- 菜单、输入输出与业务逻辑分方法组织,
main方法保持简短
本周产出
- 字符串与
StringBuilder练习代码 - 异常捕获和自定义异常练习代码
- 集合操作练习代码
- 内存版学生信息管理系统
- 一份字符串、异常和集合的常用方法速查笔记
完成检查
- 能够使用
String常用方法完成查找、截取、替换和拆分 - 能够说明
==与equals()在字符串比较中的区别 - 能够使用
StringBuilder处理大量字符串拼接 - 能够使用
try...catch、throws和自定义异常处理错误 - 能够使用
ArrayList完成增删改查和遍历 - 能够使用
HashMap完成按学号查找和数量统计 - 能够使用泛型和方法避免集合中的强制类型转换
- 能够使用
Comparator对集合排序 - 已完成内存版学生信息管理系统,异常不会导致程序直接崩溃