📝 一句话概括
第六章 = 给程序发装备——八节领了八件工具:包装类、字符串、System、Math/Random、大小数、日期、格式化、正则。两条暗线(不可变家族、模板匹配)把它们串成一个整体。
6.9 本章小结
1. 八节串线
| 节 | 一句话 | 收掉的旧账 |
|---|---|---|
| 6.1 包装类 | 基本类型穿上对象外衣 | 4.5「42 装进 Object」谜底 |
| 6.2 字符串类 | String 不可变铁憨憨 | 4.5 String 常量池坑;equals 规矩三连 |
| 6.3 System类 | 工具类套路定型(构造私有+全 static) | 3.6/3.7 static 的成品课 |
| 6.4 Math与Random | 取整三兄弟 + 随机公式 | 2.3 (int) 强转、2.5 循环(猜数字) |
| 6.5 大小数类 | 溢出找 BigInteger、失真找 BigDecimal | long 边界、计算机基础 02 篇二进制失真 |
| 6.6 日期和时间类 | 毫秒值 → Date → 人话 | 6.3「毫秒不是日期」钩子 |
| 6.7 格式化类 | 模式字母逐位咬合 + 两代格式化器 | 5.2 受检异常实战(ParseException) |
| 6.8 正则表达式 | 字符串筛选模板,一行顶十行 | 5.5 if 安检升级;split/replace 升级版 |
两条暗线:
- 不可变家族:String → BigDecimal → LocalDate → DateTimeFormatter——改 = 新对象,必接返回值。认准脾气,一个懂家家懂。
- 模板匹配思想:SimpleDateFormat 模式字母逐位咬合(6.7)→ 正则四大零件(6.8)——同一套"模板对上就过、对不上就炸"的世界观。
2. 概念速查 14 条
| # | 概念 | 一句话 |
|---|---|---|
| 1 | 装箱/拆箱 | 基本类型 ↔ 包装类,自动写法背后是 valueOf/xxxValue |
| 2 | Integer 缓存池 | -128~127 共用房间,比内容一律 equals |
| 3 | String 不可变 | 所有"修改"返回新对象,不接返回值 = 白调 |
| 4 | 字面量 vs new | 字面量进常量池共用;new 造新对象 |
| 5 | == vs equals | == 比地址,equals 比内容 |
| 6 | 工具类套路 | 构造私有 + 成员全 static,如 System/Math |
| 7 | currentTimeMillis | 时间戳:1970 起算的毫秒数 = 机器的时间 |
| 8 | random 公式 | (int)(Math.random()*个数)+起点 |
| 9 | BigInteger/BigDecimal | 四口诀:构造传字符串/运算调方法/divide 带精度/结果转回去 |
| 10 | 时间戳 ↔ 日期 | Date 内藏毫秒值;getTime() 取出 |
| 11 | SimpleDateFormat | format 人话 / parse 回 Date;ParseException 受检 |
| 12 | 模式字母 | 位数=期望位数:MM 补零、M 不补、MMM 变文本 |
| 13 | 线程安全 | SimpleDateFormat 不安全(局部变量用完就扔);DateTimeFormatter 不可变=安全 |
| 14 | 正则 | 字符串筛选模板;斜杠翻倍;matches 整串匹配 |
3. 代码模板 4 段(背下来直接抄)
模板一:字符串清洗三连(6.2+6.8)
String s = " 138 1234 5678 ";
s = s.trim().replaceAll("\\s", ""); // 去所有空白
boolean ok = s.matches("1[3-9]\\d{9}"); // 正则校验
String masked = s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); // 脱敏
模板二:精确计算(6.5)
BigDecimal price = new BigDecimal("19.99");
BigDecimal total = price.multiply(new BigDecimal("3"))
.setScale(2, RoundingMode.HALF_UP); // 59.97
模板三:日期格式化两代(6.6+6.7)
// 老代:要处理受检异常
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = sdf.format(new Date());
// 新代:线程安全,不抛受检异常
String today = DateTimeFormatter.ofPattern("yyyy年MM月dd日")
.format(LocalDate.now());
模板四:随机 + 校验组合(6.4+6.8)
int code = (int)(Math.random() * 900000) + 100000; // 6 位验证码
String input = "888888";
if (String.valueOf(code).equals(input)) { ... } // 比内容用 equals
4. 八大名坑回顾
- 缓存池 == 陷阱:Integer 比内容必须 equals,
==只在 -128~127 里碰巧对 - null 拆箱:包装类是 null 时自动拆箱直接 NPE
- 不接返回值:String/BigDecimal/LocalDate 的"修改"全是白调
- substring 含头不含尾、MM 月 mm 分别写反
- BigDecimal 传字符串:
new BigDecimal(0.1)继承 double 的失真 - divide 不带舍入:除不尽直接 ArithmeticException
- SimpleDateFormat 静态共享:线程一多日期错乱且不报错
- 正则斜杠不翻倍:编译直接报错;点不转义校验白做
5. 本章进度条
- ✅ 基本类型的对象形态(包装类 + 装拆箱)
- ✅ 字符串处理全套(String → 格式化 → 正则)
- ✅ 数值精确计算(BigInteger / BigDecimal)
- ✅ 日期时间表达(Date / SimpleDateFormat / LocalDate 会认)
- ✅ 随机与工具类套路(Math / Random / System)
Java API 章完结 🎉 —— 加上前五章:语法 → 流程控制 → 方法数组 → 面向对象 → 异常 → API,基础阶段只剩少数几个大站点(集合 / 常用进阶)就齐装满员。
6. 跨章连线
- 第五章 异常/5.2 运行时异常与编译时异常:本章 RuntimeException 大点名——NumberFormatException(6.1)、ArithmeticException(6.5)、PatternSyntaxException(6.8)都是运行时;ParseException 是受检
- 第四章 面向对象(下)/4.5 Object类:equals/hashCode 规矩本章反复使用(String、包装类全按它来)
- 第三章 面向对象(上)/3.7 static关键字:System/Math/Arrays 全是工具类套路的活教材
7. 毕业自检(综合本章 5 题)
❓ Q1:`Integer a = 100, b = 100; Integer c = 200, d = 200;` 判断 `a==b` 和 `c==d`。
a==b true(100 在缓存池 -128~127,同一房间);c==d false(200 出池,各自 new)。结论:比内容永远 equals。
❓ Q2:`"abc123".replace("a","x")` 打印后原串变了吗?`replaceAll("\\d","*")` 返回值没接会怎样?
原串永远不变(String 不可变);replaceAll 返回值不接 = 白调,什么都不发生——不可变家族统一脾气。
❓ Q3:订单金额 19.99 元 ×3,用 double 和 BigDecimal 各算一次,为什么结果不同?BigDecimal 该怎么构造?
double 二进制失真得 59.97000000000001 附近;BigDecimal 传字符串构造(new BigDecimal("19.99"))精确得 59.97。传 double 构造会把失真一起继承。
❓ Q4:把字符串 "2026-09-19" 变成 "2026年09月19日" 两种写法?(老代要处理什么异常)
老:SimpleDateFormat("yyyy-MM-dd").parse(s) 再用 "yyyy年MM月dd日" 格式化——要 throws ParseException(受检);新:LocalDate.parse(s) + DateTimeFormatter.ofPattern("yyyy年MM月dd日").format(d)——不抛受检异常。
❓ Q5(毕业大题):写一段"订单录入"综合代码——输入 `"张三; 138 1234 5678 ;19.99"`(姓名;手机;单价),完成:①按 `;` 切分并 trim;②手机号去空格并正则校验;③单价 ×3 精确算总价;④输出"张三 138****5678 59.97"。
参考答案:
String[] parts = input.split(";");
String name = parts[0].trim();
String phone = parts[1].replaceAll("\\s", "");
if (!phone.matches("1[3-9]\\d{9}")) throw new IllegalArgumentException("手机号不对");
String masked = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
BigDecimal total = new BigDecimal(parts[2].trim())
.multiply(new BigDecimal("3")).setScale(2, RoundingMode.HALF_UP);
System.out.println(name + " " + masked + " " + total); // 张三 138****5678 59.97
一题串起 6.2(trim/split)、6.8(正则校验+脱敏)、6.5(BigDecimal)、6.1 拆箱——本章四件套齐上阵。
8. 下一步学什么
- ☑ 第七章 7.1 集合概述 ✅ —— 已完成:点此复习 —— 新章开课:数组的三大痛点交给集合,家族地图先认站名,自动装箱第一线在这里上岗。
相关笔记
- 第六章 Java API/6.8 正则表达式 ← 上一篇:本章最后一站
- 第四章 面向对象(下)/4.8 本章小结:上一章小结——三大特性收官
- 第五章 异常/5.6 本章小结:上一章小结——异常全流程闭环
- 🏠 主页:回主页看全系列进度