你发任你发,我用Java8。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以免费学习。关注公众号【BAT的乌托邦】逐个击破,深入掌握,拒绝浅尝辄止。

✍前言

2020年9月15日,JDK15正式发布,可谓如约而至。按照Java SE的发展路线图,JDK14自此停止更新。值得注意的是JDK15并非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、箭头表达式返回

JDK14之前写法:

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,并且还比较隐蔽,定位起来稍显困难。

JDK14等效的新写法:

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返回

JDK14之前写法:

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;
}

JDK14等效的新写法:

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的模式匹配(预览)

该功能在JDK14中处理预览版

JDK14之前写法:

public static void main(String[] args) {
Object o = "hello world";
if(o instanceof String ){
String str = String.class.cast(o);
System.out.println(str);
}
}

JDK14等效的新写法:

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 中的模式匹配)

那是因为此功能是预览特性,需要你主动开启,如下:



注意:此特性在JDK15中依旧为预览版。

三、实用的NullPointerException

略。

四、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

注意:此特性在JDK15中依旧为预览版。

五、文本块Text Blocks(二次预览)

这个特性可是非常好用,它属于二次预览:已在JDK 13预览过一次。

public static void main(String[] args) {
String html = """
<html>
<body>
<p>hello world</p>
</body>
</html>
""";
String query = """
SELECT * from USER
WHERE `id` = 1
ORDER BY `id`, `name`;
""";
}

在JDK13中,这种是换行的。在JDK14中,可以加上一个符号让其不让换行:

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`;

注意:此特性在JDK15中已经为正式版。

六、删除CMS垃圾收集器

这款著名的垃圾回收器从这个版本就彻底被删除了。JDK9开始使用G1作为默认的垃圾回收器(JDK11中ZGC开始崭露头角),就已经把CMS标记为过期了,在此版本正式删除。

七、ZGC垃圾回收器(实验)

革命性的ZGC:任意堆大小(TB级别)都能保证延迟在10ms以内,是以低延迟为首要目标的一款垃圾回收器。

在JDK14之前,ZGC只能用于Linux上,现在也可使用在windows上了

注意:此特性在JDK15中已经为正式版(JDK11开始出现)。


JDK15新特性

有了JDK14新特性回顾做铺垫,再来了解JDK15的新特性就方便很多了。

特别说明:运行JDK15需要IDEA 2020.2才能支持哦(JDK14要求IDEA 2020.1),然后关于IDEA 2020.2的使用教程(新特性),请移步我公众号前面发的这篇文章:IntelliJ IDEA 2020.2正式发布,诸多亮点总有几款能助你提效

一、文本块Text Blocks

Text Blocks首次是在JDK 13中以预览功能出现的,然后在JDK 14中又预览了一次,终于在JDK 15中被确定下来,可放心使用了(使用示例请参考文上)。

二、ZGC转正

ZGC是Java 11引入的新的垃圾收集器(JDK9以后默认的垃圾回收器是G1),经过了多个实验阶段,自此终于成为正式特性。

ZGC是一个重新设计的并发的垃圾回收器,可以极大的提升GC的性能。支持任意堆大小而保持稳定的低延迟(10ms以内),性能非常可观。

打开方式:使用-XX:+UseZGC命令行参数打开,相信不久的将来它必将成为默认的垃圾回收器。

三、Shenandoah转正

怎么形容Shenandoah和ZGC的关系呢?异同点大概如下:

  • 相同点:性能几乎可认为是相同的
  • 不同点:ZGC是Oracle JDK的,根正苗红。而Shenandoah只存在于OpenJDK中,因此使用时需注意你的JDK版本

打开方式:使用-XX:+UseShenandoahGC命令行参数打开。

四、删除Nashorn JavaScript Engine

Nashorn是在JDK提出的脚本执行引擎,早在JDK11就已经把它标记为过期了,JDK15完全移除。

在JDK11中取以代之的是GraalVM。GraalVM是一个运行时平台,它支持Java和其他基于Java字节码的语言,但也支持其他语言,如JavaScript,Ruby,Python或LLVM。性能是Nashorn的2倍以上

五、CharSequence新增isEmpty默认方法

啥都不说,源码一看便知:

@since 15
default boolean isEmpty() {
return this.length() == 0;
}

String实现了CharSequence接口的,这应该地球人都知道吧。

升级建议

自己玩玩就行,毕竟不是LTS版本。

但是,虽然说仅限于自己玩玩就行,但不代表就没有关注的意义哈。还是那个道理,如果JDK12、13、14、15...都不关注些的话,到时候突然来个JDK17的LTS版本,接受起来就会稍显困难。

✍总结

JDK15整体来看新特性方面并不算很亮眼,它主要是对之前版本预览特性的功能做了确定,如文本块、ZGC等,这么一来我们就可以放心大胆的使用啦。

半年一次的发版速度真心学不动了,不过还好我有我的坚持:你发任你发,我用Java8。

公众号后台回复:JDK15,一键打包获取IDEA2020.2.2 + JDK15安装包(mac + windows)

推荐阅读:

JDK15正式发布,划时代的ZGC同时宣布转正的更多相关文章

  1. JDK15正式发布,新增功能预览!

    JDK 15 在 2020 年 9 月 15 号正式发布了,这次发布的主要功能有: JEP 339:EdDSA 数字签名算法 JEP 360:密封类(预览) JEP 371:隐藏类 JEP 372:删 ...

  2. Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)

    千里之行,始于足下.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://www.you ...

  3. IntelliJ IDEA 2020.3正式发布,年度最后一个版本很讲武德

    仰不愧天,俯不愧人,内不愧心.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://ww ...

  4. Spring Cloud 2020.0.0正式发布,再见了Netflix

    目录 ✍前言 版本约定 ✍正文 Spring Cloud版本管理 与Spring Boot版本对应关系 当前支持的版本 阻断式升级(不向下兼容) 1.再见了,Netflix Netflix组件替代方案 ...

  5. 1. 揭秘Spring类型转换 - 框架设计的基石

    仰不愧天,俯不愧人,内不愧心.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://ww ...

  6. 3. 搞定收工,PropertyEditor就到这

    分享.成长,拒绝浅藏辄止.搜索公众号[BAT的乌托邦],回复关键字专栏有Spring技术栈.中间件等小而美的原创专栏供以免费学习.本文已被 https://www.yourbatman.cn 收录. ...

  7. 4. 上新了Spring,全新一代类型转换机制

    目录 ✍前言 版本约定 ✍正文 PropertyEditor设计缺陷 新一代类型转换 Converter 代码示例 不足 ConverterFactory 代码示例 不足 GenericConvert ...

  8. 5. 穿过拥挤的人潮,Spring已为你制作好高级赛道

    目录 ✍前言 版本约定 ✍正文 默认转换器注册情况 StreamConverter 代码示例 使用场景 兜底转换器 ObjectToObjectConverter part1:快速返回流程 part2 ...

  9. 6. 抹平差异,统一类型转换服务ConversionService

    目录 ✍前言 版本约定 ✍正文 ConverterRegistry ConversionService ConfigurableConversionService GenericConversionS ...

随机推荐

  1. Python默认参数的陷阱

    一:内置函数 globals() locals() 1.返回的是字典,字典里面的键值对:全局作用域的全部内容 print(globals()) 2.返回的是字典,字典里面的键值对:当前作用域的全部内容 ...

  2. 简述 jpg png gif png-8 png-24 的区别

    Gif  格式的特点: 1.透明性,GIF是一种布尔透明类型,既可以是全透明,又可以是不透明,但是不可以半透明: 2.动画    GIF支持动画. 3.无损耗性    GIF是一种无损耗的图像格式,也 ...

  3. 火题大战Vol.0 B 计数DP

    火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...

  4. NRF52840 添加 led service

    记录NRF52840 添加LED service的流程,以及遇到的问题. 由于SDK中已经有了led service的.c和.h文件,因此只需要添加文件,并且调用相关函数即可. 注:编译调试环境为ke ...

  5. JavaScript学习系列博客_33_JavaScript String对象

    String对象 在底层,字符串是以数组的形式保存的.比如说一个字符串"String"以["H","t","r",&qu ...

  6. PHP、JS一些用法

    PHP去除小数点后面的0,保留非零 floatval($num) PHP转数组var d = eval(数组d); PHP字符串转数组 $row['0'] = explode(";" ...

  7. 虚拟化技术之kvm镜像模板制作工具virt-sysprep

    virt-sysprep这个工具来自libguest-tools这个工具包,它能够把kvm虚拟机对应的磁盘文件做成一个模板,后续我们启动虚拟机就可以基于这个镜像模板启动:什么是镜像模板呢?所谓模板就是 ...

  8. 深入理解k8s中的访问控制(认证、鉴权、审计)流程

    Kubernetes自身并没有用户管理能力,无法像操作Pod一样,通过API的方式创建/删除一个用户实例,也无法在etcd中找到用户对应的存储对象. 在Kubernetes的访问控制流程中,用户模型是 ...

  9. NeuroAttack: Undermining Spiking Neural Networks Security through Externally Triggered Bit-Flips

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:2005.08041v1 [cs.CR] 16 May 2020 Abstract 由于机器学习系统被证明是有效的,因此它被广 ...

  10. 如何在Linux上使用xargs命令

    大家好,我是良许. 在使用 Linux 时,你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 xargs 命令.xargs 可以将一个命令的输出 ...