Java 11 是继 Java 8 之后的另一个长期支持(LTS)版本,于 2018 年 9 月 25 日发布,相对于 Java 8 引入了多项重要的语言特性、性能优化、API 改进和模块化支持。以下是对 Java 11 相比 Java 8 的主要新特性和提升的简洁总结,涵盖核心变化:

1. 语言特性改进

  • 局部变量类型推断(var,JEP 323,Java 10 引入)
    • 使用 var 关键字简化局部变量声明,编译器自动推断类型。

    • 示例:

      var list = new ArrayList<String>(); *// 推断为 ArrayList<String>*
      var stream = list.stream(); *// 推断为 Stream<String>*
    • Java 8 无此功能,需显式声明类型,代码较冗长。

  • Lambda 参数的局部变量语法(JEP 323,Java 11 扩展)
    • 允许在 Lambda 表达式中使用 var。

      (var x, var y) -> x + y
    • Java 8 的 Lambda 表达式不支持 var,需显式指定类型。

2. 模块化系统(Project Jigsaw)

  • Java 模块化系统(JPMS,JEP 261,Java 9 引入)
    • 引入模块化机制,允许开发者定义模块,增强封装性,减少依赖冲突(“JAR Hell”)。

    • 示例模块声明:

      module com.example {
          requires java.base;
          exports com.example.api;
      }
    • Java 11 完善了模块化支持,提供了 jlink 和 jmod 工具,用于创建定制化 JRE。

    • Java 8 完全依赖 classpath,无模块化支持。

  • jlink 和 jmods(Java 9 引入,Java 11 优化)
    • jlink 允许生成包含应用所需模块的精简 JRE,减少运行时体积。
    • Java 8 需使用完整 JRE 或第三方工具实现类似功能。

3. API 和标准库增强

  • 新 HTTP 客户端(JEP 321,Java 11 引入)
    • 提供现代化的 HttpClient,支持 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());
    • Java 8 仅支持 HttpURLConnection,功能有限且不支持异步操作。

  • 字符串 API 增强
    • 新增方法如 String.isBlank()、String.lines()、String.strip() 等,简化字符串处理。

      String s = "  Hello  \n";
      System.out.println(s.isBlank()); *// false*
      System.out.println(s.strip()); *// "Hello"*
      s.lines().forEach(System.out::println); *// 按行处理*
    • Java 8 的字符串处理功能较基础,需手动实现类似逻辑。

  • 集合 API 改进
    • 新增 Collection.toArray(IntFunction),简化数组转换。

      List<String> list = List.of("a", "b");
      String[] array = list.toArray(String[]::new);
    • Java 8 需使用 toArray(new String[0]) 等方式,较繁琐。

  • Optional 增强
    • 新增 Optional.isEmpty() 和 Optional.or() 方法。

      Optional<String> opt = Optional.empty();
      System.out.println(opt.isEmpty()); *// true*
    • Java 8 的 Optional 功能较基础。

  • Files 工具类增强
    • 新增 Files.writeString 和 Files.readString 方法,简化文件读写。

      Files.writeString(Path.of("file.txt"), "Hello");
      String content = Files.readString(Path.of("file.txt"));
    • Java 8 需使用 BufferedReader 或 Files.readAllBytes 等,代码更复杂。

4. 性能和 JVM 优化

  • 垃圾回收(GC)改进
    • G1 垃圾收集器成为默认(Java 9 引入,Java 11 优化),取代 Java 8 的 Parallel GC,适合大内存应用,暂停时间更可预测。
    • Epsilon GC(JEP 318,Java 11):无操作垃圾收集器,适合短生命周期或性能测试场景。
    • ZGC(JEP 333,Java 11 实验性):低延迟垃圾收集器,支持亚毫秒级暂停。
    • Java 8 的 CMS 和 Parallel GC 在高并发场景下暂停时间较长。
  • 动态类文件常量(JEP 309,Java 11)
    • 支持动态常量,提高字节码灵活性,优化 JIT 编译。
    • Java 8 无此功能,字节码优化较弱。
  • Flight Recorder(JFR,JEP 328,Java 11)
    • 提供低开销的性能监控和诊断工具,适合生产环境。
    • Java 8 的 JFR 需商业许可,功能受限。

5. 安全性和其他改进

  • TLS 1.3 支持(JEP 332,Java 11)
    • 提供更强的加密协议和性能,取代 Java 8 的 TLS 1.2。
  • Unicode 10 支持
    • 增强 Character 和 String 类,支持新的 Unicode 标准(如表情符号)。
    • Java 8 支持 Unicode 8,功能较旧。
  • 嵌套访问控制(JEP 181,Java 11)
    • 改进反射 API,支持嵌套类访问,简化反射代码。
    • Java 8 的反射机制较为复杂。

6. 移除和弃用

  • 移除 Java EE 和 CORBA 模块(JEP 320,Java 11)
    • Java 11 移除 java.xml.ws、java.corba 等模块,推荐使用独立库(如 Jakarta EE)。
    • Java 8 包含这些模块,但已不推荐使用。
  • 移除 pack200 和 unpack200(JEP 336,Java 11 弃用)
    • 这些工具在 Java 8 中用于 JAR 文件压缩,但在 Java 11 中标记为弃用。
  • 移除部分老旧 API
    • 如 Thread.destroy() 和 Thread.stop(Throwable) 被移除,推荐使用现代并发工具。
    • Java 8 仍包含这些不安全的 API。

7. 工具和生态系统

  • 单文件程序运行(JEP 330,Java 11)
    • 支持直接运行单个 Java 源文件,无需编译。

      java HelloWorld.java
    • Java 8 需先编译再运行(javac 和 java 分开)。

  • JShell 增强(Java 9 引入,Java 11 优化)
    • JShell 提供交互式 REPL 环境,便于快速测试代码。
    • Java 8 无 JShell,测试代码需编写完整程序。
  • JavaFX 分离
    • Java 11 将 JavaFX 从 JDK 中移除,需单独引入(如 OpenJFX)。
    • Java 8 包含 JavaFX,但集成较松散。

8. 迁移注意事项

  • 不兼容性
    • 移除 Java EE 模块和某些 API 可能导致老项目迁移困难,需引入外部依赖。
    • 模块化系统可能要求调整类路径或添加 module-info.java。
  • 长期支持
    • Java 11 是 LTS 版本(支持至 2026 年或更久),而 Java 8 的官方支持已于 2025 年结束(部分供应商延长支持)。
    • Java 11 与现代框架(如 Spring Boot 2.x)兼容性更好。

总结

Java 11 相较 Java 8 的核心提升包括:模块化系统(JPMS)增强封装性和部署效率;新 HTTP 客户端和字符串/集合 API 改进简化开发;局部变量类型推断(var)提升代码简洁性;G1 和 ZGC 优化性能;TLS 1.3 和其他安全改进增强可靠性。Java 11 移除了一些过时功能(如 Java EE 模块),推动现代化开发,适合需要长期支持和现代特性的项目。