☕ 第六章 Java API
📝 一句话概括

第六章 = 给程序发装备——八节领了八件工具:包装类、字符串、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 升级版

两条暗线:

  1. 不可变家族:String → BigDecimal → LocalDate → DateTimeFormatter——改 = 新对象,必接返回值。认准脾气,一个懂家家懂。
  2. 模板匹配思想: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. 八大名坑回顾

  1. 缓存池 == 陷阱:Integer 比内容必须 equals,== 只在 -128~127 里碰巧对
  2. null 拆箱:包装类是 null 时自动拆箱直接 NPE
  3. 不接返回值:String/BigDecimal/LocalDate 的"修改"全是白调
  4. substring 含头不含尾、MM 月 mm 分别写反
  5. BigDecimal 传字符串:new BigDecimal(0.1) 继承 double 的失真
  6. divide 不带舍入:除不尽直接 ArithmeticException
  7. SimpleDateFormat 静态共享:线程一多日期错乱且不报错
  8. 正则斜杠不翻倍:编译直接报错;点不转义校验白做

5. 本章进度条

Java API 章完结 🎉 —— 加上前五章:语法 → 流程控制 → 方法数组 → 面向对象 → 异常 → API,基础阶段只剩少数几个大站点(集合 / 常用进阶)就齐装满员。

6. 跨章连线

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. 下一步学什么


相关笔记