2021-10-26 17:17:03
上一版:JDK16正式发布,一次性发布17个新特性…不服不行!|Java技术栈,分享最新最主流的Java技术
JDK17正式发布+免费
牛逼啊,JDK16刚发布半年(2021/03/16),JDK17又如期而至(2021/09/14),这个时间点牛逼啊,蹭苹果发布会的热度?记得当年JDK15的发布也是同天,巧了。。
虽然iPhone13发布了,但真的不是13香,真没什么创新和亮点,一如既往苹果式挤牙膏,在13上真的挤到精髓了,这次我想说,JDK17更香!!
iPhone13降价算啥??JDK17直接干到免费!!!
Oracle宣布,从JDK17开始,后面的JDK都全部免费提供!!!
是的,你没有看错,Oracle这次良心了,发大招了,Java17+可以免费使用了,包括商用,更详细的条款可以阅读:
https://www.oracle.com/downloads/licenses/no-fee-license.html
来看下最新OracleJava支持路线图:
可以看到,JDK17是自2018年JDK11后的第二个长期支持版本,支持到2029年9月,好家伙,支持时间长达8年,这下可以不用死守JDK8了,JDK17+也可以是一种新的选择了。。
下一个第三个长期支持版本是JDK21,时间为2023年9月,这次长期支持版本发布计划改了,不再是原来的3年一次,而是改成了2年一次!
另外,非长期支持版本还是半年发一次不变,下一个非长期支持版本计划在2022/03发布,但注意不要用在生产。
JDK17新特性一览
JDK17这个版本提供了14个增强功能,另外在性能、稳定性和安全性上面也得到了大量的提升,以及还有一些孵化和预览特性,有了这些新变化,Java会进一步提高开发人员的生产力。
JDK17新特性详细介绍
下面是JDK17中的14个新特性详细介绍,分为5大类进行介绍!
1.语言增强409:SealedClasses
密封类,这个特性在JDK15中首次成为预览特性,在JDK16中进行二次预览,在JDK17这个版本中终于正式转正了。
密封类可以用来增强Java编程语言,防止其他类或接口扩展或实现它们。
来看下面这个示例:
publicabstractsealedclassStudentpermitsZhangSan,LiSi,ZhaoLiu{...}
类Student被sealed修饰,说明它是一个密封类,并且只允许指定的3个子类继承。
这个牛逼啊,有了这个特性,意味着以后不是你想继承就继承,想实现就实现了,你得经过允许才行。转正了,栈长会再详细写一篇,关注Java技术栈第一时间推送哦。
2.预览和孵化特性406:PatternMatchingforswitch(Preview)
为switch支持模式匹配(预览中)
instanceof模式匹配的概念大家都清楚吧?不清楚的可以看下这篇文章:Java14之模式匹配,非常赞的一个新特性!
这次在JDK17中为switch语句支持模式匹配,是个什么鬼?来看下面的示例!
老代码写法:
staticStringformatter(Objecto){Stringformatted="unknown";if(oinstanceofIntegeri){formatted=String.format("int%d",i);}elseif(oinstanceofLongl){formatted=String.format("long%d",l);}elseif(oinstanceofDoubled){formatted=String.format("double%f",d);}elseif(oinstanceofStrings){formatted=String.format("String%s",s);}returnformatted;}
模式匹配新写法:
staticStringformatterPatternSwitch(Objecto){returnswitch(o){caseIntegeri->String.format("int%d",i);caseLongl->String.format("long%d",l);caseDoubled->String.format("double%f",d);caseStrings->String.format("String%s",s);default->o.toString();};}
牛逼,直接在switch上支持Object类型,这就等于同时支持多种类型,使用模式匹配得到具体类型,大大简化了语法量,这个功能还是挺实用的,期待转正,栈长会再详细写一篇,关注Java技术栈,第一时间推送哦。
412:ForeignFunction&MemoryAPI(Incubator)
外部函数和内存API(孵化中)
改进了JDK14和JDK15引入的API,通过有效调用外部函数(即JVM之外的代码),以及安全地访问外部内存(JVM之外的内存),这些API可以调用本地库和处理本地数据,与Java运行环境之外的代码和数据进行交互。
414:VectorAPI(SecondIncubator)
矢量API(二次孵化中)
VectorAPI这是一个新的初始迭代孵化器模块,模块包:jdk.incubator.vector,用于表示在运行时可靠地编译到支持的CPU架构上的最佳矢量硬件指令的矢量计算,矢量运算可以提供优于等效标量计算的性能,并且在机器学习、人工智能和密码学等领域非常普遍。
本次增强的API允许以一种在运行时,可靠地编译为支持的CPU架构上的最佳向量指令的方式表达向量计算。
3.核心增强306:RestoreAlways-StrictFloating-PointSemantics
恢复始终执行严格模式的浮点定义。
Java最初只有严格的浮点语义,但从JDK1.2开始,为了适应当时硬件架构的限制,默认情况下允许这些严格语义中的细微变化,而现在这些都没有必要了,已被JEP306删除。
356:EnhancedPseudo-RandomNumberGenerators
增强型伪随机数生成器,java.util.random包更新了,提高了不同PRNGs(伪随机数生成器)的互操作性,并使基于需求而不是硬编码特定实现的算法变得容易。
这次更改包括伪随机数生成器(PRNG)的新的接口类型和实现,包括可调PRNGs和一个可拆分的PRNG算法(LXM),以及全新的RandomGeneratorFactory类。
382:NewmacOSRenderingPipeline
新的macOS渲染管道。
这个新管道通过使用新的AppleMetalAPI为macOS实现Java2D渲染管道,减少了JDK对已弃用的AppleOpenGLAPI的依赖。
415:Context-SpecificDeserializationFilters
上下文特定反序列化过滤器。
允许应用配置context-specific和dynamically-selected过滤器,通过一个JVM范围的过滤器工厂,用来为每个单独的反序列化操作选择一个过滤器。
403:StronglyEncapsulateJDKInternals
JDK内部强封装,它是JDK16中JEP396的延续,JDK16开始对JDK内部大部分元素默认进行强封装,sun.misc.Unsafe之类的关键内部API除外,从而限制对它们的访问。
此外,用户仍然可以选择自JDK9以来的默认的宽松的强封装,这样可以帮助用户毫不费力地升级到未来的Java版本。
4.新平台支持391:macOS/AArch64Port
macOSAArch64端口,即提供可适用于macOS的JDK版本,该版本可在基于Arm64的较新的macOS系统上本地化运行。
5.弃用和移除项411:DeprecatetheSecurityManagerforRemoval
弃用安全管理器。
安全管理器从Java1.0开始,这些年来它一直都不是保护Java应用程序代码的主要手段,也很少用于保护Java服务器端代码,所以这个版本标识为弃用状态了,未来的版本会进行移除。
398:DeprecatetheAppletAPIforRemoval
弃用AppletAPI。
Applet是一种运行在Web浏览器内的Java程序,但Applet早就没什么鸟用了,现在还有哪款浏览器支持JavaApplet的吗?在座的各位估计都没听过吧?
407:RemoveRMIActivation
移除RMI激活。
RMI激活机制已于2020年9月在JDK15中移除了,远程方法调用(RMI)激活机制现也已被移除,需要说明的是,RMI激活是RMI中一个过时的组件,自Java8以来一直是可选的。
410:RemovetheExperimentalAOTandJITCompiler
移除实验性的AOT和JIT编译器。
AOT和JIT这两个实验性的编译器,自从在JDK9中引入以来几乎没有怎么使用,市面上也出现了更为广泛使用的替代方案,并且维护它们所需的工作量很大,所以在JDK16中就已经删除了,本次从OpenJDK项目中删除了源代码。
JDK17都免费了,和OpenJDK还有啥区别?
有的,虽然两者很接近,但也还是有一点区别!
1、OracleJDK提供了各种安装程序,还包含更新规则,而OpenJDK只提供了一个纯压缩包;
2、UsageLogging仅在OracleJDK中可用;
3、OracleJDK要求第三方加密提供程序使用Java加密扩展(JCE)进行签名,而OpenJDK继续允许使用未签名的第三方加密提供程序;
4、java-version的输出也是不同的,OracleJDK返回java并包含Oracle特定的标识符,OpenJDK返回OpenJDK并且不包含特定于Oracle的标识符;
5、许可证不同,OracleJDK17+是根据Oracle免费条款和许可条件发布的,而OpenJDK在GPLv2wCP下发布的;
6、OracleJDK源代码含有"ORACLEPROPRIETARY/CONFIDENTIAL.Useissubjecttolicenseterms.",其使用受许可条款的约束,而OpenJDK源代码可参考GPL许可条款;
以上是两者最主要的6点区别。
总结
最后,本文主要介绍了JDK/Java17的14个新特性基本面,后面栈长有时间也会继续更新一些JDK新特性详细教程,关注Java技术栈第一时间推送哦。如果你想看历史Java8+系列新特性教程,也可以在菜单中进行阅读。
Java17发布了,Oracle宣布JDK17及之后的版本都免费使用,包括商用,爽!!!Oracle这次真的良心了,或许是趋于某种压力进行免费?
Java确实是在走下坡路,即使如此,也是老当益壮,是现在各大企业必用的语言之一。
虽然大部分人现在还在用着JDK7/8,甚至6,还在写着JDK5的语法,现在随着JDK17+的免费,或者在未来的不久,JDK8会逐渐被替代,JDK17+慢慢走上舞台。
往期Java教程及示例源码:
https://github.com/javastacks/javastack
OracleJDK17发布地址:
https://www.oracle.com/java/technologies/javase/17-relnotes.html
OpenJDK17发布地址:
http://openjdk.java.net/projects/jdk/17/
OracleJDK17下载地址:
https://www.oracle.com/java/technologies/javase-downloads.html
OpenJDK17下载地址:
https://jdk.java.net/17/
有兴趣的可以下载尝鲜了!!
最后,JDK17+开始免费了,你们会考虑用吗?来投票看看!
老铁们,点个在看、转发支持下哦,也欢迎分享给你的更多朋友们~
关注Java技术栈,持续分享最新、最主流的Java技术~
版权申明:本文系"Java技术栈"原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。