Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 4 周:常用类 + 异常 + 集合

本周目标

本周从“能写”变成“写现代 Java”。完成后,应能够:

  • 使用 String 和 StringBuilder 完成字符串处理
  • 使用异常体系处理可预期和不可预期的错误,并定义业务异常
  • 使用 ArrayList 保存和操作有序数据
  • 使用 HashMap 完成按学号、按姓名等键值查找
  • 使用泛型和增强 for 循环编写类型安全的集合代码
  • 把数组版的管理系统升级为集合版

学习资料与范围

视频范围学习模块学习结果
P131-P138String 的创建、常用方法、字符串比较和遍历能够完成字符串查找、截取和格式化
P139-P145StringBuilder、字符串拼接和包装类、自动拆装箱能够高效拼接字符串并处理包装类型
P146-P153异常体系、try...catch、throws、throw 和自定义异常能够捕获、抛出和定义异常
P154-P162集合体系、List、ArrayList、泛型和遍历方式能够使用集合替代数组管理数据
P163-P170Set 基础、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 的基础使用

必做练习

  1. 字符串基础:录入一个字符串,统计字符个数、数字个数、大小写字母个数。
  2. 字符串处理:实现手机号中间四位脱敏、字符串反转判断回文。
  3. 字符串比较:分别使用 == 和 equals() 比较两个字符串,输出结果并解释差异。
  4. 字符串拆分:把 "张三,100,90,80" 解析为学生姓名和三门课成绩。
  5. 拼接性能:分别使用 + 和 StringBuilder 拼接 10000 次字符串,记录耗时差异。
  6. 包装类转换:把字符串 "100" 转为整数并计算;把非法字符串 "abc" 转为整数,捕获并处理 NumberFormatException。
  7. 异常捕获:分别制造数组越界、空指针和数字格式异常,输出异常类名和异常信息。
  8. 自定义异常:定义 StudentNotFoundException,在查询不到学生时抛出并在 main 中捕获输出友好提示。
  9. 集合基础:使用 ArrayList 保存学生姓名,实现添加、删除、修改、查询和遍历。
  10. 集合去重:把包含重复学号的列表使用 Set 去重,输出去重前后的数量。
  11. 键值查找:使用 HashMap<String, Student> 按学号保存学生,实现按学号查找和删除。
  12. 集合排序:使用 Comparator 按总分对学生列表降序排序,总分相同时按学号升序。

本周综合任务:内存版学生信息管理系统

把第 3 周的模型接入集合,完成一个可交互的内存版管理系统。

要求:

  • 使用 ArrayList<Student> 作为学生数据容器,替换此前的对象数组
  • 使用 HashMap<String, Student> 建立学号到学生对象的索引,提高查找效率
  • 使用控制台菜单实现:新增学生、按学号删除、修改信息、按学号查询、按姓名模糊查询、查看全部、成绩统计
  • 新增重复学号时抛出 DuplicateStudentIdException,查询不到时抛出 StudentNotFoundException
  • 对输入的数字格式、空输入和越界选择进行处理,程序不因异常直接退出
  • 使用增强 for 或迭代器完成遍历,说明遍历中删除元素的正确做法
  • 使用泛型声明集合,不出现强制类型转换的集合代码
  • 菜单、输入输出与业务逻辑分方法组织,main 方法保持简短

本周产出

  • 字符串与 StringBuilder 练习代码
  • 异常捕获和自定义异常练习代码
  • 集合操作练习代码
  • 内存版学生信息管理系统
  • 一份字符串、异常和集合的常用方法速查笔记

完成检查

  • 能够使用 String 常用方法完成查找、截取、替换和拆分
  • 能够说明 == 与 equals() 在字符串比较中的区别
  • 能够使用 StringBuilder 处理大量字符串拼接
  • 能够使用 try...catch、throws 和自定义异常处理错误
  • 能够使用 ArrayList 完成增删改查和遍历
  • 能够使用 HashMap 完成按学号查找和数量统计
  • 能够使用泛型和方法避免集合中的强制类型转换
  • 能够使用 Comparator 对集合排序
  • 已完成内存版学生信息管理系统,异常不会导致程序直接崩溃