Java 11 是 Java 8 之后的一个重要长期支持(LTS)版本,在语言特性、性能优化、标准库、工具链等方面有显著升级。以下是两者的核心区别:

一、语言特性增强

  1. 局部变量类型推断(var)增强

    • Java 8:无此特性,变量必须显式声明类型。
    • Java 11:var 可用于 Lambda 表达式的参数(配合注解),例如:
      // Java 11 支持
      List<String> list = new ArrayList<>();
      list.forEach((@Nullable var s) -> System.out.println(s));
      
  2. 字符串操作简化
    Java 11 新增了 String 实用方法:

    "  hello  ".isBlank(); // 检查是否为空白字符串(true)
    "hello\nworld".lines().count(); // 按行拆分并计数(2)
    "java".repeat(3); // 重复字符串("javajavajava")
    "  trim  ".strip(); // 去除前后空白(同 trim(),但支持 Unicode 空白字符)
    

二、API 与标准库升级

  1. 全新 HTTP 客户端(java.net.http

    • Java 8:依赖第三方库(如 OkHttp、HttpClient 4.x)。
    • Java 11:内置异步非阻塞 HTTP 客户端,支持 HTTP/2 和 WebSocket:
      HttpClient client = HttpClient.newHttpClient();
      HttpRequest request = HttpRequest.newBuilder()
          .uri(URI.create("https://api.example.com"))
          .build();
      // 同步请求
      String response = client.send(request, HttpResponse.BodyHandlers.ofString()).body();
      // 异步请求
      client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::body)
            .thenAccept(System.out::println);
      
  2. 集合与流(Stream)增强

    • Collection.toArray(IntFunction):更灵活的数组转换,例如 list.toArray(String[]::new)
    • Stream 新增 toList() 方法:简化流结果收集(无需 Collectors.toList()):
      List<String> result = list.stream()
                                .filter(s -> s.length() > 3)
                                .toList(); // Java 11 新增
      
  3. Optional 增强
    新增 isEmpty() 方法(更直观判断空值,替代 !isPresent()):

    Optional<String> opt = Optional.empty();
    opt.isEmpty(); // true(Java 11)
    

三、性能与垃圾回收优化

  1. ZGC 垃圾收集器(实验性 -> 生产就绪)

    • Java 8:默认使用 Parallel GC 或 G1(延迟较高)。
    • Java 11:引入 ZGC(低延迟垃圾收集器),支持 TB 级内存,暂停时间不超过 10ms,适合高并发场景。
    • 启用方式:-XX:+UseZGC
  2. Epsilon 垃圾收集器
    一个“不做事”的垃圾收集器(仅分配内存,不回收),用于性能测试或短期任务:

    java -XX:+UseEpsilonGC Main
    
  3. 即时编译(JIT)优化
    对 G1 收集器的混合回收模式进行优化,提升大堆场景下的性能。

四、工具链与部署简化

  1. jlink:自定义运行时镜像

    • Java 8:需部署完整 JRE(体积大,约 200MB+)。
    • Java 11:jlink 可根据项目依赖生成最小化运行时镜像(例如仅包含 java.base 模块,体积可低至 20MB),适合容器化部署:
      jlink --module-path $JAVA_HOME/jmods --add-modules java.base --output myjre
      
  2. jshell:交互式编程工具
    Java 11 增强了 jshell(Java 9 引入),支持自动补全和代码片段执行,方便快速测试:

    jshell> int a = 10;
    jshell> a * 2 // 直接输出 20
    
  3. 移除冗余工具
    移除 javahjhat 等过时工具,推荐使用 javac -h 替代 javah

五、安全性与兼容性

  1. 默认启用 TLS 1.3
    相比 TLS 1.2 提升了握手速度和安全性,减少加密套件数量,适合 HTTPS 场景。

  2. 移除废弃 API

    • 移除 Thread.destroy()Thread.stop(Throwable) 等危险方法。
    • 移除 sun.misc.Unsafe 的部分非安全用法(推荐使用 VarHandle 替代)。
  3. 模块化系统稳定化
    Java 9 引入的模块化(Module)系统在 Java 11 中更加成熟,强制显式声明模块依赖,减少类路径冲突。

六、其他重要变化

  • Unicode 10 支持:新增 16,018 个字符和 10 个脚本。
  • 飞行记录器(JFR):从商业特性变为开源,可用于诊断和性能分析:
    java -XX:StartFlightRecording=duration=60s,filename=recording.jfr Main
    

总结:如何选择?

  • 选 Java 8

    • 项目依赖大量未兼容 Java 9+ 的老旧库。
    • 团队对新特性接受度低,维护成本优先。
    • 运行环境受限(如某些老服务器未升级)。
  • 选 Java 11

    • 追求性能提升(ZGC、JIT 优化)和部署效率(jlink)。
    • 需要使用新 API(如 HTTP 客户端、String 增强方法)。
    • 项目处于新开发阶段,或可平滑迁移(多数主流框架已支持 Java 11+)。

迁移建议:Java 11 对 Java 8 兼容性较好,主要注意模块化带来的依赖调整和废弃 API 替换,多数项目可通过工具(如 IDE 提示)平滑迁移。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐