重磅!JDK 17 发布,Oracle 宣布从 JDK 17 开始正式免费。。

我是程序汪

共 7453字,需浏览 15分钟

 ·

2021-09-26 11:06

JDK 17 正式发布+免费

牛逼啊,JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点牛逼啊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天,巧了。。

虽然 iPhone 13 发布了,但真的不是 13 香,真没什么创新和亮点,一如继往苹果式挤牙膏,在 13 上真的挤到精髓了,这次我想说,JDK 17 更香!!

iPhone 13 降价算啥??JDK 17 直接干到免费!!!

Oracle 宣布,从 JDK 17 开始,后面的 JDK 都全部免费提供!!!

是的,你没有看错,Oracle 这次良心了,发大招了,Java 17+ 可以免费使用了,包括商用,更详细的条款可以阅读:

https://www.oracle.com/downloads/licenses/no-fee-license.html

来看下最新 Oracle Java 支持路线图:

可以看到,JDK 17 是自 2018 年 JDK 11 后的第二个长期支持版本,支持到 2029 年 9 月,好家伙,支持时间长达 8 年,这下可以不用死守 JDK 8 了,JDK 17+ 也可以是一种新的选择了。。

下一个第三个长期支持版本是 JDK 21,时间为 2023 年 9 月,这次长期支持版本发布计划改了,不再是原来的 3 年一次,而是改成了 2 年一次!

另外,非长期支持版本还是半年发一次不变,下一个非长期支持版本计划在 2022/03 发布,但注意不要用在生产。

JDK 17 新特性一览

ID特性说明
1306:Restore Always-Strict Floating-Point Semantics恢复始终执行严格模式的浮点定义
2356:Enhanced Pseudo-Random Number Generators增强型伪随机数生成器
3382:New macOS Rendering Pipeline新的 macOS 渲染管道
4391:macOS/AArch64 PortmacOS AArch64 端口
5398:Deprecate the Applet API for Removal弃用 Applet API
6403:Strongly Encapsulate JDK InternalsJDK 内部强封装
7406:Pattern Matching for switch (Preview)为 switch 支持模式匹配
8407:Remove RMI Activation移除 RMI 激活
9409:Sealed Classes密封类
10410:Remove the Experimental AOT and JIT Compiler移除实验性的 AOT 和 JIT 编译器
11411:Deprecate the Security Manager for Removal弃用安全管理器
12412:Foreign Function & Memory API (Incubator)外部函数和内存 API(孵化中)
13414:Vector API (Second Incubator)矢量 API(二次孵化中)
14415:Context-Specific Deserialization Filters上下文特定反序列化过滤器

JDK 17 这个版本提供了 14 个增强功能,另外在性能、稳定性和安全性上面也得到了大量的提升,以及还有一些孵化和预览特性,有了这些新变化,Java 会进一步提高开发人员的生产力。

JDK 17 新特性详细介绍

下面是 JDK 17 中的 14 个新特性详细介绍,分为 5 大类进行介绍!


1. 语言增强

409:Sealed Classes

密封类,这个特性在 JDK 15 中首次成为预览特性,在 JDK 16 中进行二次预览,在 JDK 17 这个版本中终于正式转正了。

密封类可以用来增强 Java 编程语言,防止其他类或接口扩展或实现它们。

来看下面这个示例:

public abstract sealed class Student
    permits ZhangSan, LiSi, ZhaoLiu {
    ...
        
}

类 Student 被 sealed 修饰,说明它是一个密封类,并且只允许指定的 3 个子类继承。

这个牛逼啊,有了这个特性,意味着以后不是你想继承就继承,想实现就实现了,你得经过允许才行。


2. 预览和孵化特性

406:Pattern Matching for switch (Preview)

为 switch 支持模式匹配(预览中)

instanceof 模式匹配的概念大家都清楚吧?

这次在 JDK 17 中为 switch 语句支持模式匹配,是个什么鬼?来看下面的示例!

老代码写法:

static String formatter(Object o) {
    String formatted = "unknown";
    if (o instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (o instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (o instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (o instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}

模式匹配新写法:

static String formatterPatternSwitch(Object o) {
    return switch (o) {
        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        -> o.toString();
    };
}

牛逼,直接在 switch 上支持 Object 类型,这就等于同时支持多种类型,使用模式匹配得到具体类型,大大简化了语法量,这个功能还是挺实用的,期待转正。

412:Foreign Function & Memory API (Incubator)

外部函数和内存 API(孵化中)

改进了 JDK 14 和 JDK 15 引入的 API,通过有效调用外部函数(即 JVM 之外的代码),以及安全地访问外部内存(JVM 之外的内存),这些 API 可以调用本地库和处理本地数据,与 Java 运行环境之外的代码和数据进行交互。

414: Vector API (Second Incubator)

矢量 API(二次孵化中)

Vector API 这是一个新的初始迭代孵化器模块,模块包:jdk.incubator.vector,用于表示在运行时可靠地编译到支持的 CPU 架构上的最佳矢量硬件指令的矢量计算,矢量运算可以提供优于等效标量计算的性能,并且在机器学习、人工智能和密码学等领域非常普遍。

本次增强的 API 允许以一种在运行时,可靠地编译为支持的 CPU 架构上的最佳向量指令的方式表达向量计算。


3. 核心增强

306:Restore Always-Strict Floating-Point Semantics

恢复始终执行严格模式的浮点定义。

Java 最初只有严格的浮点语义,但从 JDK 1.2 开始,为了适应当时硬件架构的限制,默认情况下允许这些严格语义中的细微变化,而现在这些都没有必要了,已被 JEP 306 删除。

356:Enhanced Pseudo-Random Number Generators

增强型伪随机数生成器,java.util.random 包更新了,提高了不同 PRNGs(伪随机数生成器)的互操作性,并使基于需求而不是硬编码特定实现的算法变得容易。

这次更改包括伪随机数生成器(PRNG)的新的接口类型和实现,包括可跳 PRNGs 和一个可拆分的 PRNG 算法(LXM),以及全新的 RandomGeneratorFactory 类。

382:New macOS Rendering Pipeline

新的 macOS 渲染管道。

这个新管道通过使用新的 Apple Metal API 为 macOS 实现 Java 2D 渲染管道,减少了 JDK 对已弃用的 Apple OpenGL API 的依赖。

415: Context-Specific Deserialization Filters

上下文特定反序列化过滤器。

允许应用配置 context-specific 和 dynamically-selected 过滤器,通过一个 JVM 范围的过滤器工厂,用来为每个单独的反序列化操作选择一个过滤器。

403:Strongly Encapsulate JDK Internals

JDK 内部强封装,它是 JDK 16 中 JEP 396 的延续,JDK 16 开始对 JDK 内部大部分元素默认进行强封装,sun.misc.Unsafe 之类的关键内部 API 除外,从而限制对它们的访问。

此外,用户仍然可以选择自 JDK 9 以来的默认的宽松的强封装,这样可以帮助用户毫不费力地升级到未来的 Java 版本。


4. 新平台支持

391:macOS/AArch64 Port

macOS AArch64 端口,即提供可适用于 macOS 的 JDK 版本,该版本可在基于 Arm 64 的较新的 macOS 系统上本地化运行。


5. 弃用和移除项

411:Deprecate the Security Manager for Removal

弃用安全管理器。

安全管理器从 Java 1.0 开始,这些年来它一直都不是保护 Java 应用程序代码的主要手段,也很少用于保护 Java 服务器端代码,所以这个版本标识为弃用状态了,未来的版本会进行移除。

398:Deprecate the Applet API for Removal

弃用 Applet API。

Applet 是一种运行在 Web 浏览器内的 Java 程序,但 Applet 早就没什么鸟用了,现在还有哪款浏览器支持 Java Applet 的吗?在坐的各位估计都没听过吧?

407:Remove RMI Activation

移除 RMI 激活。

RMI 激活机制已于 2020 年 9 月在 JDK 15 中移除了,远程方法调用 (RMI) 激活机制现也已被移除,需要说明的是,RMI 激活是 RMI 中一个过时的组件,自 Java 8 以来一直是可选的。

410:Remove the Experimental AOT and JIT Compiler

移除实验性的 AOT 和 JIT 编译器。

AOT 和 JIT 这两个实验性的编译器,自从在 JDK 9 中引入以来几乎没有怎么使用,市面上也出现了更为广泛使用的替代方案,并且维护它们所需的工作量很大,所以在 JDK 16 中就已经删除了,本次从 OpenJDK 项目中删除了源代码。

JDK 17 都免费了,和 OpenJDK 还有区别?

有的,虽然两者很接近,但也还是有一点区别!

1、Oracle JDK 提供了各种安装程序,还包含更新规则,而 OpenJDK 只提供了一个纯压缩包;

2、Usage Logging 仅在 Oracle JDK 中可用;

3、Oracle JDK 要求第三方加密提供程序使用 Java 加密扩展(JCE)进行签名,而 OpenJDK 继续允许使用未签名的第三方加密提供程序;

4、java -version 的输出也是不同的,Oracle JDK 返回 java 并包含 Oracle 特定的标识符,OpenJDK 返回 OpenJDK 并且不包含特定于 Oracle 的标识符;

5、许可证不同,Oracle JDK 17+ 是根据 Oracle 免费条款和条件许可发布的,而 OpenJDK 在 GPLv2wCP 下发布的;

6、Oracle JDK 源代码含有 "ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.",其使用受许可条款约束的,而 OpenJDK 源代码可参考 GPL 许可条款;

以上是两者最主要的 6 点区别。

总结

最后,本文主要介绍了 JDK/Java 17 的 14 个新特性基本面。

Java 17 发布了,Oracle 宣布 JDK 17 及之后的版本都免费使用,包括商用,爽!!!Oracle 这次真的良心了,或许是趋于某种压力进行免费?

Java 确实是在走下坡路,即使如此,也是老当益壮,是现在各大企业必用的语言之一。

虽然大部分人现在还在用着 JDK 7/8,甚至 6,还在写着 JDK 5 的语法,现在随着 JDK 17+ 的免费,或者在未来的不久,JDK 8 会逐渐被替代,JDK 17+ 慢慢走上舞台。

OracleJDK 17 发布地址:

https://www.oracle.com/java/technologies/javase/17-relnotes.html

OpenJDK 17 发布地址:

http://openjdk.java.net/projects/jdk/17/

Oracle JDK 17 下载地址:

https://www.oracle.com/java/technologies/javase-downloads.html

OpenJDK 17 下载地址:

https://jdk.java.net/17/

有兴趣的可以下载尝鲜了!!

最后,JDK 17+ 开始免费了,你们会考虑用吗?来评论看看!


程序汪资料链接

程序汪接的7个私活都在这里,经验整理

Java项目分享  最新整理全集,找项目不累啦 04版

堪称神级的Spring Boot手册,从基础入门到实战进阶

卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!

卧槽!阿里大佬总结的《图解Java》火了,完整版PDF开放下载!

字节跳动总结的设计模式 PDF 火了,完整版开放下载!

欢迎添加程序汪个人微信 itwang008  进粉丝群或围观朋友圈

浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报