JDK各版本新增特性详解

一、JDK 8(LTS,2014年3月)- 革命性更新

核心特性

  1. Lambda表达式

    // 旧方式
    Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
    return a.compareTo(b);
    }
    });

    // Lambda方式
    Collections.sort(list, (a, b) -> a.compareTo(b));

  2. Stream API

    List<String> filtered = list.stream()
    .filter(s -> s.startsWith("A"))
    .map(String::toUpperCase)
    .sorted()
    .collect(Collectors.toList());

  3. 默认方法(Default Methods)

    interface Vehicle {
    default void print() {
    System.out.println("我是一辆车");
    }
    }

    interface FourWheeler {
    default void print() {
    System.out.println("我有四个轮子");
    }
    }

    class Car implements Vehicle, FourWheeler {
    @Override
    public void print() {
    Vehicle.super.print();
    FourWheeler.super.print();
    }
    }

  4. 新的日期时间API

    // 旧Date问题多,新API更清晰
    LocalDate today = LocalDate.now();
    LocalDate tomorrow = today.plusDays(1);
    LocalTime now = LocalTime.now();

    // 格式化
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String formatted = LocalDateTime.now().format(formatter);

  5. Optional类

    Optional<String> optional = Optional.ofNullable(getString());
    optional.ifPresent(System.out::println);
    String result = optional.orElse("默认值");

常用功能

  • 方法引用list.forEach(System.out::println)

  • 函数式接口@FunctionalInterface

  • Nashorn JavaScript引擎

  • Base64支持

二、JDK 11(LTS,2018年9月)

核心特性

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

    var list = new ArrayList<String>(); // 推断为ArrayList<String>
    var stream = list.stream(); // 推断为Stream<String>

  2. HTTP Client API(标准化)

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com"))
    .build();
    HttpResponse<String> response = client.send(request,
    HttpResponse.BodyHandlers.ofString());

  3. 字符串增强方法

    String str = " Hello World ";
    str.isBlank(); // 检查是否为空或仅空白字符
    str.strip(); // 去除首尾空白(比trim()更严格)
    str.repeat(3); // 重复字符串
    str.lines().count(); // 行数统计

  4. 单文件源码程序

    直接运行.java文件

    java HelloWorld.java

  5. Flight Recorder(JFR)开源

    启动JFR

    java -XX:StartFlightRecording=duration=60s,filename=recording.jfr

性能改进

  • ZGC:可扩展的低延迟垃圾收集器(实验性)

  • Epsilon GC:无操作垃圾收集器(性能测试用)

三、JDK 17(LTS,2021年9月)- 当前主流LTS

核心特性

  1. 密封类(Sealed Classes)

    public abstract sealed class Shape
    permits Circle, Rectangle, Triangle {
    // 只有这三个子类可以继承
    }

    public final class Circle extends Shape { /* ... / }
    public final class Rectangle extends Shape { /
    ... / }
    public final class Triangle extends Shape { /
    ... */ }

  2. 模式匹配switch(预览)

    static String formatter(Object obj) {
    return switch (obj) {
    case Integer i -> String.format("int %d", i);
    case Long l -> String.format("long %d", l);
    case Double d -> String.format("double %f", d);
    case String s -> String.format("String %s", s);
    default -> obj.toString();
    };
    }

  3. 文本块(标准化)

    // 多行字符串
    String json = """
    {
    "name": "张三",
    "age": 25,
    "address": {
    "city": "北京",
    "street": "中关村"
    }
    }
    """;

重要移除

  • 移除了Applet API

  • 移除了Security Manager

四、各版本特性速查表

JDK 9(2017)

复制代码
// 模块系统(Project Jigsaw)
module com.example {
    requires java.base;
    exports com.example.api;
}

// 集合工厂方法
List<String> list = List.of("A", "B", "C");
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("A", 1, "B", 2);

// 私有接口方法
interface MyInterface {
    default void method1() {
        commonMethod();
    }
    
    private void commonMethod() {
        // 私有辅助方法
    }
}

JDK 10(2018)

  • 局部变量类型推断(var)

JDK 12-16(非LTS重要特性)

JDK 14
复制代码
// instanceof模式匹配
if (obj instanceof String s) {
    // 可以直接使用s
    System.out.println(s.length());
}

// Records(数据类)
record Point(int x, int y) { }
Point p = new Point(10, 20);
System.out.println(p.x());  // 自动生成getter
JDK 15
  • 文本块转为正式功能

  • Shenandoah GC成为正式功能

JDK 16
  • Records转为正式功能

  • Pattern Matching for instanceof转为正式

五、企业开发常用功能详解

1. Stream API高级用法

复制代码
// 分组统计
Map<Department, Long> countByDept = employees.stream()
    .collect(Collectors.groupingBy(
        Employee::getDepartment, 
        Collectors.counting()
    ));

// 并行流处理
List<String> results = dataList.parallelStream()
    .filter(item -> item.isValid())
    .map(item -> process(item))
    .collect(Collectors.toList());

// 自定义收集器
Collector<Employee, ?, Map<String, Double>> avgSalaryByDept = 
    Collectors.groupingBy(
        Employee::getDepartment,
        Collectors.averagingDouble(Employee::getSalary)
    );
  1. CompletableFuture异步编程

    CompletableFuture<String> future1 = CompletableFuture
    .supplyAsync(() -> fetchDataFromAPI1());
    CompletableFuture<String> future2 = CompletableFuture
    .supplyAsync(() -> fetchDataFromAPI2());

    CompletableFuture<Void> combined = CompletableFuture
    .allOf(future1, future2);

    // 组合多个结果
    future1.thenCombine(future2, (result1, result2) ->
    processResults(result1, result2))
    .exceptionally(ex -> handleError(ex));

  2. Optional最佳实践

    // 链式调用
    String result = Optional.ofNullable(user)
    .map(User::getAddress)
    .map(Address::getCity)
    .orElse("未知城市");

    // 抛出异常
    User user = userRepository.findById(id)
    .orElseThrow(() -> new UserNotFoundException(id));

    // 条件执行
    optionalUser.ifPresentOrElse(
    user -> processUser(user),
    () -> log.warn("用户不存在")
    );

六、版本选择建议

生产环境推荐

  • 新项目:JDK 17+(LTS,长期支持)

  • 现有系统

    • 金融/保险:JDK 11或17

    • 互联网:根据框架支持选择(Spring Boot 3+需要JDK 17)

    • 传统企业:JDK 8(逐步迁移)

迁移注意事项

  1. JDK 8 → JDK 11

    • 移除Java EE模块(javax.xml.ws等)

    • 需要添加相应依赖

    • 检查废弃API使用

  2. JDK 11 → JDK 17

    • 密封类、记录类等新特性

    • 更强的封装(反射限制)

    • 移除过时GC算法

版本维护周期

  • Oracle JDK:每6个月一个版本,每3年一个LTS

  • 商用支持:LTS版本有长期技术支持

  • 开源选择:OpenJDK、Amazon Corretto、Azul Zulu

七、实用工具和命令

JVM参数调优

复制代码
# 内存设置
-Xms2g -Xmx2g -Xmn1g

# GC选择(JDK 11+)
-XX:+UseG1GC

# 记录GC日志
-Xlog:gc*:file=gc.log:time,uptime,level,tags

# 开启JFR(JDK 11+)
-XX:StartFlightRecording=delay=5s,duration=60s,filename=recording.jfr

模块化开发(JDK 9+)

复制代码
// module-info.java
module com.myapp {
    requires java.base;
    requires java.sql;
    requires transitive com.mylib;  // 传递依赖
    exports com.myapp.api;
    opens com.myapp.internal to spring.core;
}

总结

JDK的发展聚焦于:

  1. 语言现代化:Lambda、模式匹配、记录类

  2. 性能提升:新GC算法、JIT优化

  3. 开发效率:Stream API、HTTP Client

  4. 安全性:模块化、强封装

  5. 云原生:容器支持、轻量级运行时

建议持续关注OpenJDK官网和JEP(JDK Enhancement Proposal)获取最新特性信息。

相关推荐
毅炼2 小时前
hot100打卡——day08
java·数据结构·算法·leetcode·深度优先
a努力。3 小时前
国家电网Java面试被问:慢查询的优化方案
java·开发语言·面试
@小码农3 小时前
202512 电子学会 Scratch图形化编程等级考试四级真题(附答案)
java·开发语言·算法
程序猿ZhangSir3 小时前
深入理解 BIO,NIO,AIO 三者的用途和区别?Select,poll,epoll 操作系统函数简介
java·spring·nio
智航GIS3 小时前
6.2 while循环
java·前端·python
2201_757830873 小时前
AOP核心概念
java·前端·数据库
为所欲为、Lynn3 小时前
用FastJson的Filter自动映射枚举
java·spring boot
qq_336313933 小时前
java基础-IO流(转换流)
java·开发语言·python
雪人.3 小时前
JavaWeb经典面试题
java·服务器·前端·java面试题