JDK各版本新特性

一、JDK 8 核心新特性 🔴

1. Lambda 表达式

干什么:简化匿名内部类写法,函数式编程。 为什么出现:匿名内部类代码冗余、写法啰嗦。 解决问题:减少模板代码,简化集合遍历、线程、比较器等写法。 用法示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 传统写法
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("传统线程");
    }
};

// Lambda 简化
Runnable r2 = () -> System.out.println("Lambda 线程");

2. Stream 流

干什么:对集合做过滤、排序、映射、统计、聚合链式操作。 为什么出现:传统for循环遍历写法繁琐、可读性差。 解决问题:一行代码完成集合复杂处理,声明式编程。 示例

1
2
3
4
5
6
List<String> list = Arrays.asList("a","bb","ccc");

List<String> res = list.stream()
        .filter(s -> s.length() > 1)
        .map(String::toUpperCase)
        .collect(Collectors.toList());

3. 函数式接口

干什么:被 @FunctionalInterface 修饰,只能有一个抽象方法,配合 Lambda 使用。 内置四大核心

  • Consumer 消费型:入参无返回
  • Supplier 供给型:无入参有返回
  • Function 函数型:入参转返回
  • Predicate 断言型:返回布尔

解决问题:统一规范 Lambda 适用场景。

4. Optional 空值容器

干什么:优雅处理 null,减少空指针异常。 为什么出现:项目大量 if(null != obj) 臃肿。 解决问题:杜绝野蛮空判断,链式安全取值。 示例

1
2
3
String name = Optional.ofNullable(user)
        .map(User::getName)
        .orElse("默认姓名");

5. 接口默认方法 / 静态方法

干什么:接口可以有带实现的默认方法、静态方法。 为什么出现:接口升级新增方法,所有实现类都要重写,兼容性差。 解决问题:接口新增方法不强制实现类重写,向下兼容。 示例

1
2
3
4
5
6
7
8
interface A {
    default void hello() {
        System.out.println("默认方法");
    }
    static void staticMethod() {
        System.out.println("接口静态方法");
    }
}

6. 新时间日期 API(java.time)

干什么:全新不可变时间类:LocalDate / LocalTime / LocalDateTime / Instant 为什么出现:旧 Date、Calendar 设计烂、可变、线程不安全、格式化麻烦。 解决问题:线程安全、不可变、API友好、时区分离。 示例

1
2
LocalDateTime now = LocalDateTime.now();
LocalDateTime tomorrow = now.plusDays(1);

7. HashMap 底层优化

干什么:数组 + 链表 + 红黑树。 解决问题:链表过长查询慢,长度≥8转红黑树,≤6退化成链表。


二、JDK 11 常用新特性(LTS 长期支持)

1. 字符串增强 API

干什么:新增 isBlank()、strip()、lines()、repeat() 解决问题:频繁字符串处理还要自己写工具类。 示例

1
2
3
"   ".isBlank();      // true 空白字符也算空
" abc ".strip();      // 去首尾空白
"a".repeat(3);        // aaa

2. 本地变量类型推断 Var

干什么:用 var 自动推断变量类型。 为什么出现:类型声明重复冗余。 解决问题:简化局部变量写法,不用重复写类型。 示例

1
2
var list = new ArrayList<String>();
var map = new HashMap<>();

注意:只能用在局部变量,不能用于成员变量、方法入参、返回值。

3. HttpClient 正式标准化

干什么:全新异步 HTTP 客户端。 解决问题:旧 HttpURLConnection 难用、第三方 OkHttp 需引包。 示例

1
2
3
4
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://www.baidu.com"))
        .build();

4. 模块系统优化、垃圾回收优化

ZGC、低延迟GC开始铺垫,整体性能、内存占用优化。


三、JDK 17 常用新特性(最强 LTS、企业主流升级版)

1. 密封类 Sealed 🔴

干什么:用 sealed 限制哪些类可以继承/实现当前类。 为什么出现:无法可控限制继承,任意类都能随便继承扩展。 解决问题:严格控制类的继承范围,做架构约束、防止滥用继承。 示例

1
2
// 只允许 Student、Teacher 继承 Person
public sealed class Person permits Student, Teacher {}

2. 增强 Var 支持 + 模式匹配增强

简化 instanceof 强转,不用手动强转旧写法

1
2
3
if (obj instanceof User) {
    User u = (User) obj;
}

JDK17 新写法

1
2
3
if (obj instanceof User u) {
    // 直接用 u
}

3. 文本块 """ 多行字符串

干什么:三个双引号定义多行文本。 解决问题:多行JSON、SQL、HTML 拼接大量换行符、引号转义。 示例

1
2
3
4
5
6
String json = """
{
    "name":"张三",
    "age":20
}
""";

4. 废弃 Applet、安全加固、封装更强

底层内部API私有化,禁止非法反射篡改,安全性提升。


四、JDK 21 常用新特性(最新 LTS、未来主流)

1. 虚拟线程 Virtual Thread(最重要)

干什么:JDK 轻量级线程,由 JVM 管理,非操作系统内核线程。 为什么出现:传统平台线程重量级、线程数受限、高并发下资源耗尽。 解决问题百万级线程无压力,极大提升并发能力,替代线程池繁琐调优。 示例

1
2
3
4
// 创建虚拟线程
Thread vt = Thread.ofVirtual().start(() -> {
    System.out.println("虚拟线程执行");
});

核心价值:IO 密集型业务(接口、数据库、MQ)吞吐量暴涨,不用纠结线程池核心数。

2. 结构化并发

干什么:批量管理一组虚拟线程,父子线程生命周期绑定。

解决问题:多线程任务散乱、异常难统一处理、容易泄露线程。

3. 模式匹配、记录类 Record 正式完善

Record 记录类:快速定义不可变数据载体,不用手写 get、构造、toString。 示例

1
2
// 自动生成构造器、getter、equals、toString
public record User(Long id, String name) {}

解决问题:DTO、实体类模板代码太多。

4. 集合有序增强、简化写法

集合工厂方法进一步简化,只读集合创建更方便。


总结 🔴

  1. JDK8:Lambda、Stream、Optional、新时间API、接口默认方法,项目最常用基础。
  2. JDK11:var局部推断、字符串增强、标准HttpClient,轻量简化代码。
  3. JDK17:密封类sealed、instanceof模式匹配、多行文本块,架构约束+语法简化。
  4. JDK21:虚拟线程(最大亮点)、结构化并发、Record记录类,高并发性能大幅提升,未来企业升级首选。