JDK 11 是 Oracle 于 2018 年发布的 Java 开发工具包,也是继 JDK 8 之后的第二个长期支持(LTS)版本(支持周期至 2026 年 9 月)。
我用夸克网盘分享了「jdk」,:https://pan.quark.cn/s/c72666843e2b
一、JDK 11 与 JDK 8 的相同点
核心语言基础一致
两者均遵循 Java 语言的核心设计思想,如面向对象(封装、继承、多态)、异常处理、垃圾回收(GC)机制等核心特性保持一致。基础类库(如java.lang、java.util、java.io等)的核心功能(如String、List、Map的基础用法)未发生破坏性变更。兼容性设计
JDK 11 保持了对 JDK 8 代码的向后兼容性,大多数基于 JDK 8 开发的应用无需修改(或仅需少量调整)即可在 JDK 11 上运行。LTS 版本特性
两者均为长期支持版本(LTS),适合企业级应用(Oracle 对 JDK 8 的免费支持已结束,付费支持持续;JDK 11 的免费支持持续至 2024 年,付费支持至 2026 年)。基本工具链
核心开发工具(如javac编译器、java运行器、jar打包工具)的基础功能保持一致,使用方式无本质差异。
二、JDK 11 与 JDK 8 的不同点及 JDK 11 的升级点
JDK 11 在 JDK 8 的基础上,通过多个中间版本(JDK 9 - 10)的积累,带来了大量新特性、API 增强、性能优化和工具链升级,主要差异如下:
1. 语言特性增强
局部变量类型推断(
var关键字)
JDK 10 引入,JDK 11 继续支持。允许在声明局部变量时省略类型,由编译器自动推断,简化代码:// JDK 8 需要显式声明类型 String str = "hello"; List<String> list = new ArrayList<>(); // JDK 11 可简化为 var str = "hello"; // 推断为 String var list = new ArrayList<String>(); // 推断为 List<String>Lambda 表达式的局部变量语法增强
JDK 11 允许在 Lambda 参数中使用var,同时支持注解:// JDK 8 (String s1, String s2) -> s1 + s2; // JDK 11 (var s1, var s2) -> s1 + s2; (@NonNull var s1, @NonNull var s2) -> s1 + s2; // 支持注解
2. 核心 API 增强
JDK 11 对大量基础类库进行了扩展,新增了实用方法,简化开发:
String类增强
新增isBlank()(判断空白字符串备注)、lines()(按行拆分字符串)、strip()(去除首尾空白,支持 Unicode备注)等方法:String str = " \nhello world \n"; str.isBlank(); // false(非全空白) str.lines().count(); // 2(拆分出两行) str.strip(); // "hello world"(去除首尾空白,比 trim() 更强大)集合类增强
新增of()方法快速创建不可变集合(替代Collections.unmodifiableXXX):List<String> list = List.of("a", "b"); // 不可变 List Map<String, Integer> map = Map.of("a", 1, "b", 2); // 不可变 MapOptional类增强
新增isEmpty()(判断是否为空,替代!isPresent())、orElseThrow()(无参版本,更简洁):Optional<String> opt = Optional.empty(); opt.isEmpty(); // true opt.orElseThrow(); // 抛出 NoSuchElementException标准化 HTTP 客户端(
HttpClient)
JDK 9 引入实验性 HTTP 客户端,JDK 11 将其正式纳入java.net.http包,支持 HTTP/2 和 WebSocket,替代老旧的HttpURLConnection:HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://example.com")) .build(); // 发送同步请求 HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
3. 模块化系统(Jigsaw)
JDK 9 引入的模块化系统在 JDK 11 中进一步完善,这是与 JDK 8 最核心的差异之一:
- JDK 8 以“JAR 包 + 类路径(classpath)”管理依赖,存在依赖混乱、应用体积过大等问题。
- JDK 11 通过
module-info.java定义模块,明确声明依赖和导出的接口,实现“按需加载”,减少内存占用,增强安全性。// module-info.java 示例 module com.example.demo { requires java.base; // 依赖基础模块 requires java.net.http; // 依赖 HTTP 客户端模块 exports com.example.demo.service; // 导出可被其他模块访问的包 }
4. 工具链升级与变更
新增
jlink工具
可根据模块依赖,将应用和所需的 JDK 模块打包为自定义运行时镜像(精简版 JRE),大幅减小部署体积(尤其适合容器化场景)。jshell交互式工具
JDK 9 引入,JDK 11 完善。支持交互式编写和执行 Java 代码(类似 Python 终端),方便快速测试:$ jshell jshell> int a = 10; a ==> 10 jshell> a * 2 $2 ==> 20移除与合并工具
- 移除
javah(生成 native 头文件,功能被javac -h替代)、policytool等过时工具。 - 不再提供单独的 JRE 安装包(JRE 可通过
jlink生成)。
- 移除
5. 性能与垃圾回收优化
G1 垃圾收集器优化
JDK 11 中 G1 引入“并行 Full GC”,解决了 JDK 8 中 G1 Full GC 单线程执行效率低的问题,减少大堆场景下的停顿时间。新增低延迟垃圾收集器
引入 ZGC(实验性,JDK 15 转正)和 Shenandoah(实验性),支持 TB 级堆内存,停顿时间控制在毫秒级(JDK 8 仅支持 G1、ParallelGC、CMS 等)。JVM 常量 API
新增java.lang.constant包,提供对字节码常量池的编程访问,方便框架(如 Spring、Lombok)处理常量。
6. 安全性增强
- 默认启用 TLS 1.3(更安全、性能更好的加密协议),替代 JDK 8 中的 TLS 1.2 作为默认协议。
- 移除了多个不安全的加密算法(如 MD5、SHA-1 用于证书验证时被禁用)。
- 加强对内部 API 的限制(如
sun.misc.Unsafe需通过反射显式允许,避免依赖非标准 API 导致兼容性问题)。
7. 其他重要变更
- 终止对
applet和Java Web Start的支持(JDK 8 已标记为过时,JDK 11 彻底移除),因浏览器已普遍停止支持 Java 插件。 - UTF-8 作为默认字符集(JDK 8 依赖系统默认字符集,可能导致跨平台乱码)。
- 增强
Process类:新增pid()(获取进程 ID)、info()(获取进程信息)等方法,简化进程管理。
浙公网安备 33010602011771号