JDK-11 | 我为什么越来越喜欢用 Java 的 String/Collection 新 API
这是专栏第 11 篇。
这一篇我不讲单一语法点,而是讲一组“每天都能用到”的 API 升级。
这些能力看起来分散,但我在项目里落地后有一个共同收益:
样板代码更少、边界更清晰、代码审查效率更高。
一、JDK 8 时代的高频样板代码问题
在 JDK 8 项目里,我经常会看到这些重复模式:
- 字符串判空要
trim().isEmpty()组合; - 去首尾空白写法不统一(尤其 Unicode 空白);
- 快速构造只读集合要
Collections.unmodifiableXxx(...); - 为了不可变快照还要额外复制一遍集合。
这些代码不是难,而是“太多、太碎、太容易风格不一致”。
二、版本信息(关键节点)
常用能力大致分布在 Java 9/10/11:
- Java 9:
List.of/Set.of/Map.of - Java 10:
copyOf(集合不可变快照) - Java 11:
String.isBlank/strip/lines/repeat
我在生产里通常以 JDK 17/21 为落地基线,一次性吃到这批能力。
三、这组 API 到底解决了什么
1. 让“意图”直接写在代码里
比如“我要不可变集合”可以直接List.of(...),不再绕多层包装。
2. 减少工具类噪音
以前要依赖各种StringUtils做基础操作,现在很多场景 JDK 原生就够了。
3. 边界行为更统一
例如isBlank和strip对 Unicode 空白处理更一致,减少隐性 bug。
四、适配场景 / 不适配场景
适配场景:
- 代码库历史包袱重,字符串和集合写法风格分散;
- 需要快速推广不可变集合,降低共享可变状态风险;
- 希望减少第三方工具类依赖。
不适配场景:
- 强依赖可变集合但误用了
of/copyOf; - 旧接口必须接收
null元素(of系列不允许); - 团队未统一不可变集合的异常处理习惯。
五、从 JDK 8 升级时,我会重点看这 8 件事
1)isBlank与旧判空语义
isBlank()会把全空白字符串判为空白。
如果你旧逻辑只关心长度,要确认语义是否一致。
2)strip与trim差异
strip()基于 Unicode 空白,trim()不是。
国际化文本处理里这个差异很关键。
3)List.of不允许null
迁移时如果数据可能含null,会直接抛NullPointerException,要先清洗数据。
4) 不可变集合修改异常
of/copyOf返回不可变集合,后续add/remove会抛UnsupportedOperationException。
这不是 bug,是语义边界。
5)copyOf的快照语义
copyOf适合做防御性复制,减少外部修改影响。
迁移时要明确“是共享引用还是不可变快照”。
6) API 替换策略
不
