mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JDK 11 是 Oracle 于 2018 年发布的 Java 开发工具包,也是继 JDK 8 之后的第二个长期支持(LTS)版本(支持周期至 2026 年 9 月)。

我用夸克网盘分享了「jdk」,:https://pan.quark.cn/s/c72666843e2b

一、JDK 11 与 JDK 8 的相同点

  1. 核心语言基础一致
    两者均遵循 Java 语言的核心设计思想,如面向对象(封装、继承、多态)、异常处理、垃圾回收(GC)机制等核心特性保持一致。基础类库(如 java.langjava.utiljava.io 等)的核心功能(如 StringListMap 的基础用法)未发生破坏性变更。

  2. 兼容性设计
    JDK 11 保持了对 JDK 8 代码的向后兼容性,大多数基于 JDK 8 开发的应用无需修改(或仅需少量调整)即可在 JDK 11 上运行。

  3. LTS 版本特性
    两者均为长期支持版本(LTS),适合企业级应用(Oracle 对 JDK 8 的免费支持已结束,付费支持持续;JDK 11 的免费支持持续至 2024 年,付费支持至 2026 年)。

  4. 基本工具链
    核心开发工具(如 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); // 不可变 Map
  • Optional 类增强
    新增 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. 其他重要变更
  • 终止对 appletJava Web Start 的支持(JDK 8 已标记为过时,JDK 11 彻底移除),因浏览器已普遍停止支持 Java 插件。
  • UTF-8 作为默认字符集(JDK 8 依赖系统默认字符集,可能导致跨平台乱码)。
  • 增强 Process:新增 pid()(获取进程 ID)、info()(获取进程信息)等方法,简化进程管理。
posted on 2025-10-27 17:29  mthoutai  阅读(14)  评论(0)    收藏  举报