JDK 15 正式发布,划时代的 ZGC 同时宣布转正!
作者 | YourBatman
头图 | CSDN 下载自东方 IC
出品 | CSDN(ID:CSDNnews)
前言
2020年9月15日,JDK 15 正式发布,可谓如约而至。按照 Java SE 的发展路线图,JDK 14 自此停止更新。值得注意的是 JDK 15 并非 LTS 版本,Oracle 官方对 Java SE 的支持路线图如下:
JDK8 的扩展支持时间超过了 JDK11 ,Oracle 你是认真的吗?开个玩笑~
那么自 Java11 之后,哪个版本才是 LTS 版本呢?Oracle 官方并没给出具体参考路线图,但可参考 OpenJDK 的这张:
可以看到 JDK17 将是下一个 LTS 版本,预计发版日期是2021年9月份。当然喽这只是 OpenJDK 的发版线路图,并不代表 Oracle 官方,因此仅供参考,不过一般八九不离十。
小贴士:OpenJDK 和 Oracle JDK 自从 JDK11 后,就共享了绝大部分代码了,节奏基本保持一致。
从 JDK9 之后,Oracle 采用了新的发布周期:每6个月发布一个版本,每3年发布一个 LTS 版本。JDK14 是继 JDK9 之后发布的第四个版本, 该版本为非 LTS 版本,最新的 LTS 版本为 JDK11 。因为是小鹿快跑,快速迭代,因此此处解释下这两个词:孵化器模块( Incubator )和预览特性( Preview )。
孵化器模块(孵化版/实验版)
尚未定稿的 API /工具,主要用于从 Java 社区收集使用反馈,稳定性无保障,后期有较大可能性移除
预览特性(预览版)
规格已成型,实现已确定,但还未最终定稿。这些特性还是存在被移除的可能性,但一般来说最后都会被固定下来。
新特性
JDK15 是 Java SE 平台的第15个版本,由 JSR 390 在 Java 社区进程中指定。
OpenJDK 15 是9-15发布的,Oracle 同步跟上。其它厂商的对应 JDK 版本也会随后跟上
该版本共提供14个新特性,通过这些 JEP 来表示,截图如下:
下面针对其中对开发者日常编程关系较大的特性拉出来解释,并给出对应的使用示例(其实就是 JEP 378喽)。
JDK14新特性回顾
老规矩,在进行 JDK15 的新特性介绍之前,先回顾下 JDK14 的主要特性有哪些。JDK 14 于2020年3月17日发布。
Switch表达式
新的 Switch 表达式其实早在 JDK 12、13中都已存在了,但只是预览版,到了 JDK 14就彻底变为稳定版了,可以放心商用。
小贴士:预览版特性是有可能在后续版本中被移除的,但稳定版后几乎不可能被移除
switch 新的表达式有两个显著的特点:
支持箭头表达式返回
支持 yield 和 return 返回值。
1、箭头表达式返回
JDK 14之前写法:
private static void printLetterCount(DayOfWeek dayOfWeek){switch (dayOfWeek) {case MONDAY:case FRIDAY:case SUNDAY:System.out.println(6);break;case TUESDAY:System.out.println(7);break;case THURSDAY:case SATURDAY:System.out.println(8);break;case WEDNESDAY:System.out.println(9);break;}
}
要点:break 可千万别忘记写,否则就是个大 bug ,并且还比较隐蔽,定位起来稍显困难。
JDK 14等效的新写法:
private static void printLetterCount(DayOfWeek dayOfWeek){switch (dayOfWeek) {case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);case TUESDAY -> System.out.println(7);case THURSDAY, SATURDAY -> System.out.println(8);case WEDNESDAY -> System.out.println(9);}
}
可明显看到新写法不需要一个个 break 了,从语法层面规避了我们犯错的可能性。
2、yield 返回
JDK 14之前写法:
private static int getLetterCount(DayOfWeek dayOfWeek){int letterCount;switch (dayOfWeek) {case MONDAY:case FRIDAY:case SUNDAY:letterCount = 6;break;case TUESDAY:letterCount = 7;break;case THURSDAY:case SATURDAY:letterCount = 8;break;case WEDNESDAY:letterCount = 9;break;default:throw new IllegalStateException("非法: " + dayOfWeek);}return letterCount;
}
JDK 14等效的新写法:
private static int getLetterCount(DayOfWeek dayOfWeek){return switch (dayOfWeek) {case MONDAY, FRIDAY, SUNDAY -> 6;case TUESDAY -> 7;case THURSDAY, SATURDAY -> 8;case WEDNESDAY -> 9;};
}
使用箭头操作符操作效果立竿见影。当然,你还可以使用 yield 关键字返回:
private static int getLetterCount(DayOfWeek dayOfWeek){return switch (dayOfWeek) {case MONDAY -> 6;default -> {int letterCount = dayOfWeek.toString().length();yield letterCount;}};
}
instanceof的模式匹配(预览)
该功能在 JDK 14中处理预览版。
JDK 14之前写法:
public static void main(String[] args) {Object o = "hello world";if(o instanceof String ){String str = String.class.cast(o);System.out.println(str);}
}
JDK 14等效的新写法:
public static void main(String[] args) {Object o = "hello world";// 屁股里直接可写个变量名,不再需要强转了if(o instanceof String str){System.out.println(str);}
}再如:
if (obj instanceof String s && s.length() > 5) {s.contains(..)
}
如果你运行时有如下错误:
java: instanceof 中的模式匹配 是预览功能,默认情况下禁用。(请使用 --enable-preview 以启用 instanceof 中的模式匹配)
那是因为此功能是预览特性,需要你主动开启,如下:
注意:此特性在 JDK 15中依旧为预览版。
Record(预览)
Java 年纪太大,语法不够新潮,有时候确实太麻烦,因此有了 Record 的出现:干掉那些 get/set 、toString 、equals 等方法。
public record Person(String name,Integer age) {
}public static void main(String[] args) {Person person= new Person("YourBatman", 18);System.out.println(person);System.out.println(person.name());System.out.println(person.age());
}
运行程序,结果打印:
Person[name=YourBatman, age=18]
YourBatman
18
注意:此特性在 JDK 15中依旧为预览版。
文本块Text Blocks(二次预览)
这个特性可是非常好用,它属于二次预览:已在 JDK 13预览过一次。
public static void main(String[] args) {String html = """<html><body><p>hello world</p></body></html>""";String query = """SELECT * from USERWHERE `id` = 1ORDER BY `id`, `name`;""";
}
在 JDK 13中,这种是有换行的。在 JDK 14中,可以加上一个符号让其不让换行:
public static void main(String[] args) {String query = """SELECT * from USER \WHERE `id` = 1 \ORDER BY `id`, `name`;\""";System.out.println(query);
}
运行程序,输出(可以看到展示为一行了):
SELECT * from USER WHERE `id` = 1 ORDER BY `id`, `name`;
注意:此特性在 JDK 15中已经为正式版。
删除CMS垃圾收集器
这款著名的垃圾回收器从这个版本就彻底被删除了。JDK 9开始使用 G1 作为默认的垃圾回收器( JDK 11中 ZGC 开始崭露头角),就已经把 CMS 标记为过期了,在此版本正式删除。
ZGC垃圾回收器(实验)
革命性的 ZGC :任意堆大小( TB 级别)都能保证延迟在10ms以内,是以低延迟为首要目标的一款垃圾回收器。
在 JDK 14之前,ZGC 只能用于 Linux 上,现在也可使用在 windows 上了
注意:此特性在 JDK 15中已经为正式版( JDK 11开始出现)。
JDK15新特性
有了 JDK 14新特性回顾做铺垫,再来了解 JDK 15的新特性就方便很多了。
特别说明:运行 JDK 15需要 IDEA 2020.2才能支持哦( JDK 14要求 IDEA 2020.1)。
1、文本块Text Blocks
Text Blocks 首次是在 JDK 13中以预览功能出现的,然后在 JDK 14中又预览了一次,终于在 JDK 15中被确定下来,可放心使用了(使用示例请参考文上)。
2、ZGC转正
ZGC 是 Java 11引入的新的垃圾收集器( JDK 9以后默认的垃圾回收器是 G1 ),经过了多个实验阶段,自此终于成为正式特性。
ZGC 是一个重新设计的并发的垃圾回收器,可以极大的提升 GC 的性能。支持任意堆大小而保持稳定的低延迟(10ms以内),性能非常可观。
打开方式:使用 -XX:+UseZGC 命令行参数打开,相信不久的将来它必将成为默认的垃圾回收器。
3、Shenandoah转正
怎么形容 Shenandoah 和 ZGC 的关系呢?异同点大概如下:
相同点:性能几乎可认为是相同的
不同点:ZGC 是 Oracle JDK 的,根正苗红。而 Shenandoah 只存在于 OpenJDK 中,因此使用时需注意你的 JDK 版本
打开方式:使用 -XX:+UseShenandoahGC 命令行参数打开。
4、删除Nashorn JavaScript Engine
Nashorn 是在 JDK 提出的脚本执行引擎,早在 JDK 11就已经把它标记为过期了,JDK 15 完全移除。
在 JDK 11中取以代之的是 GraalVM。GraalVM 是一个运行时平台,它支持 Java 和其他基于 Java 字节码的语言,但也支持其他语言,如 JavaScript, Ruby ,Python 或 LLVM 。性能是 Nashorn 的2倍以上。
5、CharSequence新增isEmpty默认方法
啥都不说,源码一看便知:
@since 15
default boolean isEmpty() {return this.length() == 0;
}
String 实现了 CharSequence 接口的,这应该地球人都知道吧。
升级建议
自己玩玩就行,毕竟不是 LTS 版本。
但是,虽然说仅限于自己玩玩就行,但不代表就没有关注的意义哈。还是那个道理,如果 JDK 12、13、14、15…都不关注些的话,到时候突然来个 JDK 17的 LTS 版本,接受起来就会稍显困难。
总结
JDK 15整体来看新特性方便并不算两眼,它主要是对之前预览特性的功能做了确定,如文本块、 ZGC 等,这么一来就可以放心大胆的使用啦。
JDK 半年一次的发版速度真的学不动了,不过还好我有我的坚持:你发任你发,我用 Java 8。
原文:https://blog.csdn.net/f641385712/article/details/108620778
声明:本文为 CSDN 博主YourBatman的原创作品,版权归作者所有。本文已获授权。
更多精彩推荐
☞大数据杀熟行为10月1日起明令禁止;阿里一号工程“犀牛制造”正式亮相;iOS 14 正式版发布 | 极客头条☞华为 HarmonyOS 2.0 全面升级,构建中国软件的“根”!
☞程序员找 Bug 福音!微软全新开源查找修复 Bug 工具——Project OneFuzz
☞B 站神曲damedane:精髓在于换脸,五分钟就能学会
☞可怕!公司部署了一个东西,悄悄盯着你……
☞极简椭圆曲线密码学入门
点分享点点赞点在看
JDK 15 正式发布,划时代的 ZGC 同时宣布转正!相关推荐
- Java基础学习总结(160)——JDK15正式发布,划时代的ZGC同时宣布转正
✍前言 2020年9月15日,JDK15正式发布,可谓如约而至.按照Java SE的发展路线图,JDK14自此停止更新.值得注意的是JDK15并非「LTS」版本,Oracle官方对Java SE的支持 ...
- 一文汇总 JDK 5 到 JDK 15 中的牛逼功能!
前言 JDK 16 马上就要发布啦(预计 2021.3.16 日发布),所以在发布之前,让我们先来回顾一下 JDK 5-15 的新特性吧,大家一起学起来~ Java 5 新特性 1. 泛型 泛型本质是 ...
- JDK 16 正式发布!程序员:追不上了...
点击"开发者技术前线",选择"星标????" 让一部分开发者看到未来 地址:https://blog.csdn.net/csdnnews/article/det ...
- oracle jdk1.7 内存,JDK 16 正式发布,一次性发布 17 个新特性…不服不行!
上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...
- JDK 16 正式发布,一次性发布 17 个新特性,不服不行
JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. 来看下 Oracle Java 支持路线图: Ora ...
- JAVA17版本,JDK 16 正式发布,一次性发布 17 个新特性…不服不行!
JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. 来看下 Oracle Java 支持路线图: Ora ...
- JDK 15 JAVA 15的新特性展望
文章目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: ...
- 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜
自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15. 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 ...
- Java基础学习总结(176)——JDK 16 正式发布,一次性发布 17 个新特性
JDK 16 正式发布 JDK 16 不是一个长期支持的版本,只支持 6 个月到 2021 年 9 月,上一个长期支持版本还是 JDK 11,下一个长期支持版本是 JDK 17,还有半年也要发布了.所 ...
最新文章
- hadoop(9)--MapReduce入门WordCount
- linux7开启ipmi,通过IPMI安装CentOS7教程
- 【机器学习基础】Python机器学习入门指南(全)
- linux fedora下vscode终端字体间距不正常解决办法
- 一文读懂 KMP 算法
- 深度学习(10)-- Capsules Networks(CapsNet)
- 使用 React和webpack开发和打包发布
- python自己创建模块引用失败_详解Python import方法引入模块的实例 Python怎么import自己写的模块...
- IntelliJ IDEA 导入新项目以后的简单配置
- Container with most water
- Linux 下删除大量文件
- 抖音检测注入框架分析
- 微软代码审查工具_Microsoft如何进行代码审查?
- db2 dec函数oracle,DB2常用函数与Oracle有什么区别?
- ORACLE-工作常用配置及命令记录-导入sql、unl文件、查看数据库状态、修改字符集等...
- MIT 18.06 +线性代数的几何意义+3Blue1Brown 笔记
- tracking里面几种常见图的画法
- 目标检测——数据获取和标注(一)
- 257套工业机器人SW设计3D图纸焊接机械手/发那科ABB安川臂模型
- linux主机又又中木马了
热门文章
- 什么是搜索引擎分词技巧
- 【算法导论】指针作为形式参数时 改变指针所指的值(二叉排序树)
- ORACLE的跟踪文件
- Populating Additional data in Material master record
- 文档比较比对工具Beyond Compare
- android (12) Fragment使用
- UVa 11889 (GCD) Benefit
- 有关send()和recv()函数的理解
- 北航|北京航空航天大学|介绍|简介
- linux java new date_Linux java Tomcat 项目中 new Date 获取时间 8小时 时差