jdk8 后各个版本的新特性详解

----------------------------------------------------------------------------------------------------

Java 版本迭代中,LTS(长期支持)版本(如 8、11、17)因提供 5-8 年的官方支持,被企业广泛采用。以下按版本顺序梳理 JDK 8 及之后的核心新特性,重点突出 LTS 版本的关键更新:

一、JDK 8(2014 年,LTS)—— 革命性的版本

JDK 8 引入了大量改变 Java 编程范式的特性,是 Java 历史上最具影响力的版本之一:
  1. Lambda 表达式:用简洁语法实现函数式编程,替代匿名内部类(如 (a, b) -> a + b)。
  2. Stream API:声明式处理集合(过滤、映射、聚合等),支持并行处理(parallelStream())。
  3. Optional 类:封装可能为 null 的值,避免空指针异常(NPE)。
  4. 新日期时间 API(java.time 包):替代线程不安全的 Date/Calendar,提供 LocalDateInstant 等不可变类。
  5. CompletableFuture:增强异步编程,支持链式操作、异常处理和任务组合,替代传统 Future
  6. 接口默认方法与静态方法:接口可定义带实现的方法(default 关键字),解决接口升级兼容性问题。
  7. 方法引用:简化 Lambda 表达式(如 Integer::parseInt 替代 s -> Integer.parseInt(s))。

二、JDK 9(2017 年)—— 模块化与工具增强

JDK 9 重点是模块化系统,同时增强了现有 API:
  1. 模块系统(Project Jigsaw):引入 module-info.java 定义模块依赖,解决 “类路径地狱”(类冲突、冗余依赖),实现代码封装与隔离。例:module com.example.app { requires java.base; }(声明依赖基础模块)。
  2. 接口私有方法:接口中可定义 private 方法,供默认方法调用,避免代码重复(default 方法可调用私有方法)。
  3. 集合工厂方法:新增 List.of()Set.of()Map.of() 等静态方法,创建不可变集合(比 Collections.unmodifiableList() 更高效)。例:List<String> list = List.of("a", "b");(不可修改,添加元素会抛异常)。
  4. JShell(交互式编程工具):支持即时执行 Java 代码片段(无需写类和 main 方法),适合快速测试和学习。
  5. Stream API 增强:新增 takeWhile(Predicate)(保留满足条件的前缀)、dropWhile(Predicate)(丢弃满足条件的前缀)、ofNullable(T)(支持单元素空流)。
  6. try-with-resources 增强:可在 try 括号中使用已定义的资源变量(无需重新声明)。例:InputStream is = new FileInputStream("a.txt"); try (is) { ... }

三、JDK 11(2018 年,LTS)—— 实用 API 与性能优化

JDK 11 作为继 8 之后的第二个 LTS 版本,聚焦稳定性和实用性:
  1. HTTP 客户端(标准化):正式引入 java.net.http 包,替代老旧的 HttpURLConnection,支持 HTTP/2 和 WebSocket,API 更简洁(基于 CompletableFuture 实现异步)。例:
    java
     
    运行
     
     
     
     
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).build();
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
          .thenApply(HttpResponse::body)
          .thenAccept(System.out::println);
    
     
     
  2. 局部变量类型推断增强(var):var 可用于 Lambda 参数(需显式声明泛型),提升复杂 Lambda 的可读性。例:(var x, var y) -> x + y(适用于长参数名场景)。
  3. 字符串方法增强:
    • strip():去除前后空白(比 trim() 更智能,支持 Unicode 空白字符)。
    • isBlank():判断字符串是否为空或仅含空白字符。
    • lines():按行分割字符串,返回 Stream<String>
    • repeat(int n):重复字符串 n 次。
  4. Files 工具类增强:
    • Files.readString(Path):直接读取文件内容为字符串(适用于文本文件)。
    • Files.writeString(Path, String):直接写入字符串到文件。
  5. ZGC(实验性低延迟垃圾收集器):引入可扩展、低延迟的 ZGC(Z Garbage Collector),暂停时间不超过 10ms,支持 TB 级内存。
  6. 移除冗余组件:移除过时的 CORBAJava EE 和 JAX-WS 模块,精简 JDK。

四、JDK 17(2021 年,LTS)—— 现代语言特性与性能飞跃

JDK 17 是目前企业主流选择的 LTS 版本,整合了 12-16 版本的预览特性,增强语言表达能力:
  1. 密封类(Sealed Classes):限制类的继承关系,用 sealed 修饰类,并通过 permits 指定允许继承的子类,避免无限制扩展导致的混乱。例:
    java
     
    运行
     
     
     
     
    public sealed class Shape permits Circle, Rectangle { ... }
    final class Circle extends Shape { ... } // 必须是 final 或 sealed
    
     
     
  2. 模式匹配增强(instanceof):简化类型判断与转换,无需显式强制转型。例:
    java
     
    运行
     
     
     
     
    if (obj instanceof String s) { // 若 obj 是 String,直接用 s 引用
        System.out.println(s.length()); 
    }
    
     
     
  3. switch 表达式增强:
    • 支持箭头语法(case x -> ...),无需 break
    • 支持 yield 关键字返回值(替代 return,更清晰)。
    • 可作为表达式直接赋值。
       
      例:
     
    java
     
    运行
     
     
     
     
    int result = switch (day) {
        case MONDAY, TUESDAY -> 3;
        case WEDNESDAY -> 2;
        default -> { yield 1; }
    };
    
     
     
  4. 记录类(Records):简化 “数据载体类”(POJO)的定义,自动生成 equals()hashCode()toString() 和 getter 方法(不可变)。例:public record User(String id, String name) {}(等价于带 idname 的不可变类)。
  5. 垃圾收集器升级:
    • ZGC 和 Shenandoah 从实验性变为生产就绪(默认仍为 G1),支持低延迟、大内存场景。
    • 移除 CMS 收集器。
  6. 其他实用特性:
    • 向量 API(孵化):高效处理数值向量运算(适合机器学习等场景)。
    • 增强伪随机数生成器:新增 RandomGenerator 接口,统一各类随机数生成器。
    • 移除实验性的 AOT( Ahead-of-Time)编译和 JIT 编译器。

五、总结:版本选择建议

  • JDK 8:最广泛兼容,适合依赖旧库的项目,但缺乏现代语言特性。
  • JDK 11:平衡兼容性与新特性,适合需要 HTTP 客户端、ZGC 且对新语法要求不高的场景。
  • JDK 17:推荐新项目使用,具备密封类、记录类等现代特性,性能更优,且是目前支持周期最长的 LTS 版本(至 2029 年)。
各版本的核心演进逻辑:从 “函数式编程基础”(8)→“模块化与工具链”(9)→“实用 API 增强”(11)→“现代语言特性与性能”(17),逐步提升 Java 的简洁性、安全性和执行效率。
 
jdk 8 后 各个版本的新特性 详解
 
JDK 8 之后,Java 版本迭代加速,每 6 个月发布一个主版本,并每 3 年推出一个 LTS(长期支持)版本(如 11、17、21)。以下按版本顺序详解 JDK 9 及之后的核心新特性,重点突出语言特性、API 增强、性能优化等关键更新:

一、JDK 9(2017 年)—— 模块化与基础能力升级

JDK 9 的核心是模块化系统,同时对现有 API 进行了大幅增强,为后续版本奠定了基础。
  1. 模块系统(Project Jigsaw)引入 module-info.java 文件,将代码封装为模块,明确声明依赖关系和对外暴露的接口,解决传统 “类路径地狱”(类冲突、冗余依赖)问题。示例:
    java
     
    运行
     
     
     
     
    // module-info.java
    module com.example.service {
        requires java.base; // 依赖基础模块(默认隐式依赖)
        requires com.example.api; // 依赖其他模块
        exports com.example.service.user; // 暴露指定包
    }
    
     
     
  2. 接口私有方法允许接口中定义 private 方法,供默认方法(default)或静态方法调用,减少代码冗余。
    java
     
    运行
     
     
     
     
    public interface MathUtils {
        default int add(int a, int b) {
            log("add called"); // 调用私有方法
            return a + b;
        }
        
        private void log(String msg) { // 私有方法
            System.out.println("[LOG] " + msg);
        }
    }
    
     
     
  3. 不可变集合工厂方法新增 List.of()Set.of()Map.of() 等静态方法,创建轻量、不可变的集合(比 Collections.unmodifiableXXX 更高效,修改会抛 UnsupportedOperationException)。
    java
     
    运行
     
     
     
     
    List<String> list = List.of("a", "b", "c");
    Set<Integer> set = Set.of(1, 2, 3);
    Map<String, Integer> map = Map.of("one", 1, "two", 2);
    
     
     
  4. JShell(交互式编程工具)支持即时执行 Java 代码片段,无需编写类和 main 方法,适合快速测试和学习。
    bash
     
     
    jshell> int a = 10;
    a ==> 10
    jshell> a * 2
    $2 ==> 20
    
     
     
  5. Stream API 增强
    • takeWhile(Predicate):从流开头开始,保留满足条件的元素(遇到第一个不满足的就停止)。
    • dropWhile(Predicate):从流开头开始,丢弃满足条件的元素(遇到第一个不满足的就保留剩余)。
    • ofNullable(T):创建包含单个元素的流(支持 null,此时返回空流)。
     
    java
     
    运行
     
     
     
     
    List<Integer> nums = List.of(1, 2, 3, 4, 5);
    nums.stream().takeWhile(n -> n < 3).forEach(System.out::print); // 1 2
    
     
     

二、JDK 10(2018 年)—— 局部变量类型推断

JDK 10 聚焦简化代码,核心特性是局部变量类型推断。
  1. 局部变量类型推断(var 关键字)
     
    允许用 var 声明局部变量,编译器根据赋值自动推断类型,减少代码冗余(仅适用于局部变量,不能用于字段、方法参数或返回值)。
    java
     
    运行
     
     
     
     
    var list = new ArrayList<String>(); // 推断为 ArrayList<String>
    var map = Map.of("a", 1); // 推断为 Map<String, Integer>
    var str = "hello"; // 推断为 String
    
     
     

三、JDK 11(2018 年,LTS)—— 实用工具与性能优化

作为第二个 LTS 版本,JDK 11 整合了 9-10 的特性,并新增大量实用功能,同时提升稳定性。
  1. HTTP 客户端(标准化,java.net.http 包)替代老旧的 HttpURLConnection,支持 HTTP/2 和 WebSocket,API 简洁且基于 CompletableFuture 实现异步操作。
    java
     
    运行
     
     
     
     
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://api.example.com"))
        .header("Accept", "application/json")
        .build();
    
    // 异步发送请求
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join(); // 等待结果
    
     
     
  2. 字符串方法增强
    • isBlank():判断字符串是否为空或仅含空白字符(比 isEmpty() 更智能)。
    • strip()/stripLeading()/stripTrailing():去除空白(支持 Unicode 空白字符,如全角空格)。
    • lines():按行分割字符串,返回 Stream<String>
    • repeat(int n):重复字符串 n 次。
     
    java
     
    运行
     
     
     
     
    "  \t\n".isBlank(); // true(空白字符)
    "  hello  ".strip(); // "hello"(去除前后空白)
    "a\nb\nc".lines().count(); // 3(3行)
    "ab".repeat(3); // "ababab"
    
     
     
  3. Files 工具类增强新增 readString(Path) 和 writeString(Path, String) 方法,简化文本文件读写:
    java
     
    运行
     
     
     
     
    // 读取文件内容为字符串
    String content = Files.readString(Path.of("test.txt"));
    // 写入字符串到文件
    Files.writeString(Path.of("output.txt"), "Hello, JDK 11");
    
     
     
  4. ZGC(实验性低延迟垃圾收集器)引入 ZGC(Z Garbage Collector),目标是暂停时间不超过 10ms,支持 TB 级内存,适合高吞吐量、低延迟场景(JDK 15 中成为生产就绪)。
  5. 移除冗余组件移除过时的 CORBAJava EE 相关模块(如 java.xml.ws),精简 JDK 体积。

四、JDK 12(2019 年)—— 语法简化与性能工具

  1. switch 表达式(预览)支持箭头语法(case x -> ...),无需 break,且可作为表达式返回值(需通过 --enable-preview 启用)。
    java
     
    运行
     
     
     
     
    int day = 2;
    String result = switch (day) {
        case 1 -> "周一";
        case 2 -> "周二";
        default -> "其他";
    };
    
     
     
  2. 数字格式化工具(CompactNumberFormat)简化大数字的格式化(如 “1000”→“1K”,“1000000”→“1M”):
    java
     
    运行
     
     
     
     
    NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
    System.out.println(fmt.format(12345)); // "12K"
    
     
     
  3. JVM 常量 API新增 java.lang.constant 包,提供对常量池的强类型访问(如 ClassDescMethodTypeDesc)。

五、JDK 13(2019 年)—— 文本块与网络增强

  1. 文本块(Text Blocks,预览)用三重引号(""")定义多行字符串,自动保留换行和缩进,避免手动拼接 \n 和转义字符。
    java
     
    运行
     
     
     
     
    String json = """
        {
            "name": "Alice",
            "age": 30
        }
        """;
    
     
     
  2. switch 表达式增强(预览)新增 yield 关键字,用于在代码块中返回值(替代 return,更清晰):
    java
     
    运行
     
     
     
     
    int num = switch (day) {
        case 1, 2, 3, 4, 5 -> 5;
        case 6, 7 -> {
            System.out.println("周末");
            yield 2; // 返回值
        }
        default -> 0;
    };
    
     
     

六、JDK 14(2020 年)—— 模式匹配与空指针优化

  1. instanceof 模式匹配(预览)简化类型判断与转换,无需显式强制转型:
    java
     
    运行
     
     
     
     
    if (obj instanceof String s) { // 若 obj 是 String,直接用 s 引用
        System.out.println(s.length()); // 无需 (String) obj 转型
    }
    
     
     
  2. Records(预览)用于定义 “数据载体类”(POJO),自动生成 equals()hashCode()toString() 和 getter 方法(不可变):
    java
     
    运行
     
     
     
     
    record User(String id, String name) {} // 等价于带 id、name 的不可变类
    User user = new User("1", "Alice");
    System.out.println(user.name()); // "Alice"(自动生成的 getter)
    
     
     
  3. 空指针异常(NPE)信息优化NPE 堆栈信息会显示具体的空值变量,便于调试:
    plaintext
     
     
    // 原信息:NullPointerException
    // 新信息:Cannot invoke "String.length()" because "s" is null
    
     
     

七、JDK 15(2020 年)—— 密封类与文本块正式版

  1. 密封类(Sealed Classes,预览)限制类的继承关系,用 sealed 修饰类,并通过 permits 指定允许继承的子类,避免无限制扩展:
    java
     
    运行
     
     
     
     
    public sealed class Shape permits Circle, Rectangle, Triangle {
        // 密封类的方法...
    }
    final class Circle extends Shape {} // 必须是 final、sealed 或 non-sealed
    
     
     
  2. 文本块(正式版)从预览转为正式特性,支持 \s 转义符(忽略当前行的尾随行分隔符):
    java
     
    运行
     
     
     
     
    String html = """
        <html>
            <body>\s
                <p>Hello</p>
            </body>
        </html>
        """;
    
     
     
  3. ZGC 生产就绪低延迟垃圾收集器 ZGC 从实验性变为正式支持,适合大内存场景。

八、JDK 16(2021 年)—— Records 正式与模式匹配增强

  1. Records(正式版)数据载体类的简化定义正式落地,不可变特性确保线程安全:
    java
     
    运行
     
     
     
     
    record Point(int x, int y) {
        // 可自定义构造方法或方法,但不能添加非静态字段
        public Point {
            if (x < 0 || y < 0) throw new IllegalArgumentException();
        }
    }
    
     
     
  2. instanceof 模式匹配(正式版)从预览转为正式特性,广泛用于简化类型判断逻辑。
  3. Vector API(孵化)提供向量运算支持,优化数值计算性能(如机器学习、科学计算)。

九、JDK 17(2021 年,LTS)—— 现代语言特性集大成者

作为第三个 LTS 版本,JDK 17 整合了 12-16 的核心特性,成为企业主流选择。
  1. 密封类(正式版)限制继承关系,增强代码可维护性(如框架设计中定义固定扩展点)。
  2. switch 表达式(正式版)箭头语法和 yield 关键字正式支持,替代传统 switch 的冗余写法。
  3. 移除实验性特性移除 AOT 编译和 JIT 编译器,精简 JDK。
  4. Shenandoah 垃圾收集器(生产就绪)低延迟垃圾收集器 Shenandoah 从实验性变为正式支持,适合需要快速响应的场景。
  5. 其他特性
    • 增强伪随机数生成器(RandomGenerator 接口)。
    • 禁止对 final 类进行子类化的反射操作(增强安全性)。

十、JDK 18-20(2022-2023 年)—— 预览特性迭代

  1. JDK 18:
    • 文本块增强(@ 符号支持,避免转义)。
    • 虚拟线程(预览,轻量级线程,大幅提升并发性能)。
  2. JDK 19:
    • 虚拟线程(二次预览)。
    • 结构化并发(预览,简化多线程代码的错误处理和取消操作)。
  3. JDK 20:
    • 虚拟线程(三次预览)。
    • 模式匹配 for switch(预览,支持对对象属性的匹配)。

十一、JDK 21(2023 年,LTS)—— 虚拟线程与模式匹配

最新 LTS 版本,聚焦并发编程和语法简化。
  1. 虚拟线程(正式版)轻量级线程(用户态线程),由 JVM 管理,无需绑定操作系统线程,可创建数百万级线程,大幅降低并发编程成本:
    java
     
    运行
     
     
     
     
    // 启动 1000 个虚拟线程
    for (int i = 0; i < 1000; i++) {
        Thread.startVirtualThread(() -> {
            // 执行任务(如 HTTP 请求、数据库操作)
        });
    }
    
     
     
  2. 模式匹配 for switch(正式版)支持对对象的属性、类型进行多条件匹配,替代复杂的 if-else 链:
    java
     
    运行
     
     
     
     
    Object obj = ...;
    String result = switch (obj) {
        case Integer i -> "整数:" + i;
        case String s && s.length() > 5 -> "长字符串:" + s;
        case null -> "空值";
        default -> "其他类型";
    };
    
     
     
  3. 结构化并发(预览)将多个相关线程视为一个 “任务单元”,简化异常处理和取消操作,避免线程泄漏。

总结:版本演进核心脉络

JDK 8 之后的版本演进呈现三大趋势:
  1. 语言简化:从 var 推断、文本块到 Records、模式匹配,持续减少样板代码。
  2. 并发增强:从 CompletableFuture 到虚拟线程、结构化并发,降低高并发编程门槛。
  3. 性能与安全:ZGC、Shenandoah 等低延迟 GC 普及,加强类型安全和反射限制。
版本选择建议:
  • 追求稳定性和兼容性:选择 JDK 17(支持至 2029 年,特性丰富)。
  • 探索最新特性:选择 JDK 21(虚拟线程等革命性特性,适合新项目)。
  • 老旧系统迁移:从 JDK 8 逐步过渡到 JDK 11,再升级到 17/21。

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

posted @ 2025-10-15 15:46  hanease  阅读(40)  评论(0)    收藏  举报