JDK 11:模块化之后,第一个 LTS
JDK 11 是 Java 6 个月发布节奏下的第一个 LTS。它把 JDK 9 的模块系统、JDK 10 的 var、以及 JDK 11 自己的 HttpClient、单文件源码启动、String / Files 便利方法和 ZGC 打包成一个可长期使用的基线。它的难点不是新语法,而是版本归属:很多被称作「JDK 11 新特性」的东西,其实来自 9 或 10。
这一课,你必须能自己回答GOALS
合上资料后,逐条自述
- var 是 JDK 10 还是 11?它推断出的类型在什么时候确定,哪些位置不能用?
- JDK 9、10、11 各自带来了什么?为什么 JDK 11 的课程必须先把这三个版本拆开?
- HttpClient 的连接池、HTTP/2 多路复用与 sendAsync 如何配合?为什么 JDK 11 不能对它使用 try-with-resources?
- String.isBlank / lines / strip / repeat 与 Files.readString / writeString 的边界分别是什么?默认编码是哪一版改变的?
- List.of / Map.of 来自哪一版?它们和 Arrays.asList、Collections.unmodifiableList、List.copyOf 的行为差在哪里?
- 单文件源码启动解决了什么问题?它不生成 class 文件、只支持一个源文件,这些限制意味着什么?
- ZGC 的着色指针、读屏障、并发整理如何把停顿压到 10ms 以内?为什么 JDK 11 的 ZGC 只能算实验能力?
- JPMS 的模块路径与类路径、未命名模块、强封装分别是什么?JDK 11 的 --illegal-access 默认值,和 JDK 17 有什么本质区别?
三种模式,各解决一个问题MODES
学习路径TRACKS
面试突击 · 2 小时
先结论后边界先刷 JDK 11 高频题,暴露「把 9/10 的能力记成 11」这类盲区,再回到速查页核对 API 与版本表。
从 8 升到 11 · 1 天
移除项 + 工具链按「版本坐标 → Java EE 移除 → 反射访问 → --release → 模块化」的顺序推进。先把启动和编译稳住,再谈模块路径。
平台能力深钻 · 2 天
机制 + 实测把 HttpClient 的连接池与异步、ZGC 的并发整理、String / Files 的编码边界放在一起看。重点不是 API 名字,而是代价和平台限制。
换一个版本,继续同一门课SWITCH
所有完整课程共用「速查 → 深钻 → 面试」结构。切换版本后,再从顶栏版本菜单切一次,就会落在目标版本的同一模块。
全部学习单元9
速查模块 · 6 个主题
var:局部变量类型推断
var 是 JDK 10 的特性,不是 11。它把局部变量的类型交给编译器推断,类型在编译期就固定,字节码里没有「动态类型」。JDK 11 只做了一件事:允许 lambda 参数写 var,从而给参数加注解。
HttpClient:标准化的 HTTP/1.1 与 HTTP/2 客户端
java.net.http.HttpClient 在 JDK 11 转正,替代老旧的 HttpURLConnection:同步/异步、HTTP/2、WebSocket、连接池和 BodyHandler 都在一套 API 里。它是线程安全、可复用的长生命周期对象;JDK 11 还没有 close()。
String 与 Files:JDK 11 的文本便利方法
JDK 11 给 String 增加了 isBlank、lines、strip、repeat,给 Files 增加了 readString / writeString。它们都很小,但编码边界比方法本身重要:Files 的默认编码是 UTF-8,而 JDK 11 的 Charset.defaultCharset() 仍然取决于平台。
集合:不可变工厂与 JDK 11 的小补丁
List.of / Set.of / Map.of 是 JDK 9 的工厂方法,List.copyOf 是 JDK 10 的不可变拷贝;JDK 11 只补了 Optional.isEmpty、Predicate.not 和 Collection.toArray(IntFunction) 等小方法。把版本拆清楚,比背 API 更重要。
单文件源码启动:java Hello.java
JDK 11 允许直接用 java 命令运行一个 .java 源文件:编译器在内存中编译,不生成 .class。它降低了脚本、教学和小工具的门槛,但不是多文件项目或生产构建的替代品。
从 8 迁移到 11
JDK 11 是 8 之后的第一个 LTS。升级的主要风险不是新语法,而是移除的 Java EE / CORBA 模块、Nashorn 与 Pack200 的弃用、G1 成为默认 GC,以及反射访问与 --release 的边界。它比 17 宽松:JDK 11 默认仍允许非法反射访问,只是警告。
深钻模块 · 3 个主题
HttpClient 内部机制:连接池、HTTP/2 与异步
HttpClient 的公共 API 很小,内部却是一条完整的异步 I/O 管线:SelectorManager 负责非阻塞事件,ConnectionPool 负责复用,Exchange 负责一次请求/响应,HTTP/2 把一条连接拆成多个 stream。理解这条管线,才能正确设置超时、并发与生命周期。
ZGC:着色指针、读屏障与并发重定位
ZGC 用着色指针把标记状态放进引用本身,用读屏障把标记、重映射和重定位的工作摊到应用线程,从而把停顿压到毫秒级。JDK 11 的它是实验特性,只支持 Linux/x64,单代、无压缩 oops、不支持类卸载。理解这些边界,比记住「低延迟」三个字重要。
JPMS 迁移:模块路径、未命名模块与强封装
JPMS 在 classpath 之上加了模块图:命名模块、自动模块、未命名模块各有不同的可读性与导出规则。迁移的难点通常不是写 module-info,而是让依赖被解析、让反射有明确的 opens。
版本上下文JDK 11
JDK 11 于 2018-09-25 发布,是 8 之后的第一个 LTS。它同时是 JPMS(9)、var(10)与 HttpClient(11)三条线的汇合点:模块系统改变了类路径与反射的规则,var 改变了局部变量的写法,HttpClient 替换了老旧的 HttpURLConnection。也正因为跨了三个版本,学习时必须逐项确认「这个能力到底从哪一版开始」。