JDK17对比JDK8体验

    前段时间把项目从JDK8迈了一大步升级到了JDK17,同时把SpringBoot也一把升级到了3.4.2,想体验一下JDK17的新特性,特意去研究和总结了一下,内容如下:

    JDK 8 到 JDK 17 跨越了 9 个大版本,累积了大量重要特性,按语法易用性性能与效率安全性模块化与工具四大维度,梳理最核心、最常用的特性:

一、核心语法与编程易用性提升

1.1 文本块(Text Blocks)

引入版本:JDK 15 正式引入

// JDK 8 写法(繁琐)
String sql8 = "SELECT id, name FROM user \n" +
              "WHERE age > 18 \n" +
              "ORDER BY create_time DESC";

// JDK 17 写法(简洁)
String sql17 = """
    SELECT id, name FROM user
    WHERE age > 18
    ORDER BY create_time DESC
    """;

Golang,Php,Scala早就支持了,只是不是用的的"""这种符号,Java也跟上了

1.2 switch 表达式(Switch Expressions)

// JDK 8 写法
int num8 = 2;
String type8;
switch (num8) {
    case 1: type8 = "奇数"; break;
    case 2: type8 = "偶数"; break;
    default: type8 = "未知"; break;
}

// JDK 17 写法
int num17 = 2;
String type17 = switch (num17) {
    case 1 -> "奇数";
    case 2 -> "偶数";
    default -> "未知";
};

// 带yield的复杂逻辑
int result = switch (num17) {
    case 1: yield 10;
    case 2: yield 20;
    default: yield 0;
};

这些新的语法支持返回值、简化语法,避免 break 穿透问题,还新增yield关键字返回值,到底能不能提高写代码的效率呢?

1.3 密封类(Sealed Classes)

引入版本:JDK 17 正式引入

// 声明密封类,仅允许指定子类继承
public sealed class Shape permits Circle, Square, Triangle {
    // 抽象方法
    public abstract double area();
}

// 合法子类(在permits列表中)
public final class Circle extends Shape {
    private double radius;
    @Override
    public double area() { return Math.PI * radius * radius; }
}

// 非法子类(不在permits列表中,编译报错)
// public class Rectangle extends Shape {}

精确控制类的继承关系,解决抽象类 / 接口被任意实现的问题,个人感觉没啥用啊?

1.4 var 局部变量类型推断

引入版本:JDK 10 引入

// JDK 8 写法
List<String> list8 = new ArrayList<String>();
Map<Integer, String> map8 = new HashMap<Integer, String>();

// JDK 17 写法
var list17 = new ArrayList<String>(); // 推断为List<String>
var map17 = new HashMap<Integer, String>(); // 推断为Map<Integer, String>

有羡慕Golang,Php或者Scala那种类型推断的写法的不用羡慕了,Java自己也有了,虽然感觉用处不大

1.5 Records(记录类)

引入版本:JDK 16 正式引入

// JDK 8 写法(需手动写大量模板代码)
public class User8 {
    private Long id;
    private String name;
    private Integer age;

    // 构造器、getter、equals、hashCode、toString(约50行代码)
}

// JDK 17 写法(一行搞定)
public record User17(Long id, String name, Integer age) {}

// 使用示例
User17 user = new User17(1L, "张三", 25);
System.out.println(user.name()); // 自动生成的访问器(无get前缀)
System.out.println(user); // 自动生成toString:User17[id=1, name=张三, age=25]

解决了手搓Getter和Setter,虽然Lombok也能解决,但是这个是提升到了JDK层面去解决了,也算是一个很大的提升吧。

二、性能与效率提升

2.1 ZGC(Z 垃圾收集器)

引入版本:JDK 17 正式启用(生产就绪)

不分代的ZGC,总感觉还差那么点意思~~~

2.2 Shenandoah GC

引入版本:JDK 17 正式引入(LTS 支持)

    另一款低延迟 GC,核心优势是暂停时间与堆大小无关,适合对响应时间要求极高的场景(如电商、金融)。

没用过,不知道怎么样~~~

2.3 默认 G1GC 优化

    相信G1在JDK17以上的基本上都用的这个吧,JDK 17 对 G1GC 做了大量优化,包括:

  • 更高效的垃圾回收周期
  • 自动调整堆区域大小
  • 减少 Full GC 的触发概率

2.4 即时编译(JIT)优化

    引入 C2 编译器的替代者 Graal(实验性),以及分层编译的优化,提升代码执行效率。

    底层程序员的我不知道他说的是啥,感觉就一个字:不明觉厉~~~

三、安全性增强

3.1 强封装 JDK 内部 API

    逐步禁止直接访问 sun.misc、com.sun 等内部 API(JDK 8 中常用的 Unsafe 类也被限制),避免依赖非标准 API 导致的兼容性问题。

3.2 TLS 1.3 支持

    相比 JDK 8 的 TLS 1.2,TLS 1.3 握手速度更快、安全性更高,减少网络传输的安全风险。

3.3 移除不安全的算法

    移除 MD5、RC4 等弱加密算法,默认禁用不安全的 TLS 协议版本,提升默认安全级别。

四、模块化与工具升级

4.1 模块化系统(Module System)- JDK 9 引入

感觉挺有用的,解决 JDK 8 的 “臃肿” 问题,将 JDK 拆分为多个模块(如 java.base、java.sql),允许程序只依赖需要的模块:

// module-info.java(模块描述文件)
module com.jaylli.app {
    // 依赖java.sql模块
    requires java.sql;
    // 导出com.example.app包供其他模块访问
    exports com.jaylli.app;
}
  • 减少应用打包体积(仅包含必要模块)
  • 明确依赖关系,避免类路径冲突
  • 增强封装性,模块内的非导出包无法被外部访问

  简单来说,就是可以只暴露需要暴露的类,不需要暴露的类即使是public修饰的,使用方也import不了

4.2 JShell(交互式 Java 工具)- JDK 9 引入

通过命令行工具,可以像Shell,scala,python,php,golang一样,直接在控制台敲代码了

# 启动JShell
jshell
# 直接执行代码
jshell> int a = 10; int b = 20; a + b
$3 ==> 30

jshell> List<String> list = List.of("a", "b", "c")
list ==> [a, b, c]

感觉没啥用

4.3 简化的空指针异常(NPE)提示

感觉这个挺有用的,JDK 17 的 NPE 异常信息会明确指出哪个变量为 null,大幅降低调试成本

// JDK 8 异常信息(模糊):
NullPointerException

// JDK 17 异常信息(精准):
NullPointerException: Cannot invoke "String.length()" because "str" is null

五 总结

JDK 17 相比 JDK 8 的核心升级可归纳为 3 个关键点:

  1. 语法层面:文本块、Records、密封类、switch 表达式等大幅减少模板代码,提升开发效率;
  2. 性能层面:ZGC/Shenandoah GC 实现低延迟垃圾回收,G1GC 优化进一步提升吞吐量;
  3. 工程层面:模块化系统解决依赖混乱问题,更精准的异常提示、JShell 等工具降低维护和调试成本。

此外,JDK 17 作为 LTS 版本,会获得至少 8 年的官方支持(远长于 JDK 8),是从 JDK 8 升级的最佳选择之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值