作者 | 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 同时宣布转正!相关推荐

  1. Java基础学习总结(160)——JDK15正式发布,划时代的ZGC同时宣布转正

    ✍前言 2020年9月15日,JDK15正式发布,可谓如约而至.按照Java SE的发展路线图,JDK14自此停止更新.值得注意的是JDK15并非「LTS」版本,Oracle官方对Java SE的支持 ...

  2. 一文汇总 JDK 5 到 JDK 15 中的牛逼功能!

    前言 JDK 16 马上就要发布啦(预计 2021.3.16 日发布),所以在发布之前,让我们先来回顾一下 JDK 5-15 的新特性吧,大家一起学起来~ Java 5 新特性 1. 泛型 泛型本质是 ...

  3. JDK 16 正式发布!程序员:追不上了...

    点击"开发者技术前线",选择"星标????" 让一部分开发者看到未来 地址:https://blog.csdn.net/csdnnews/article/det ...

  4. oracle jdk1.7 内存,JDK 16 正式发布,一次性发布 17 个新特性…不服不行!

    上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...

  5. JDK 16 正式发布,一次性发布 17 个新特性,不服不行

    JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. 来看下 Oracle Java 支持路线图: Ora ...

  6. JAVA17版本,JDK 16 正式发布,一次性发布 17 个新特性…不服不行!

    JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. 来看下 Oracle Java 支持路线图: Ora ...

  7. JDK 15 JAVA 15的新特性展望

    文章目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: ...

  8. 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

    自从 JDK9 之后,每年 3 月与 9 月 JDK 都会发布一个新的版本,而2020 年 9 月即将引来 JDK15. 恰巧 IDEA 每四五个月会升级一个较大的版本,每次升级之后都会支持最新版本 ...

  9. Java基础学习总结(176)——JDK 16 正式发布,一次性发布 17 个新特性

    JDK 16 正式发布 JDK 16 不是一个长期支持的版本,只支持 6 个月到 2021 年 9 月,上一个长期支持版本还是 JDK 11,下一个长期支持版本是 JDK 17,还有半年也要发布了.所 ...

最新文章

  1. hadoop(9)--MapReduce入门WordCount
  2. linux7开启ipmi,通过IPMI安装CentOS7教程
  3. 【机器学习基础】Python机器学习入门指南(全)
  4. linux fedora下vscode终端字体间距不正常解决办法
  5. 一文读懂 KMP 算法
  6. 深度学习(10)-- Capsules Networks(CapsNet)
  7. 使用 React和webpack开发和打包发布
  8. python自己创建模块引用失败_详解Python import方法引入模块的实例 Python怎么import自己写的模块...
  9. IntelliJ IDEA 导入新项目以后的简单配置
  10. Container with most water
  11. Linux 下删除大量文件
  12. 抖音检测注入框架分析
  13. 微软代码审查工具_Microsoft如何进行代码审查?
  14. db2 dec函数oracle,DB2常用函数与Oracle有什么区别?
  15. ORACLE-工作常用配置及命令记录-导入sql、unl文件、查看数据库状态、修改字符集等...
  16. MIT 18.06 +线性代数的几何意义+3Blue1Brown 笔记
  17. tracking里面几种常见图的画法
  18. 目标检测——数据获取和标注(一)
  19. 257套工业机器人SW设计3D图纸焊接机械手/发那科ABB安川臂模型
  20. linux主机又又中木马了

热门文章

  1. 什么是搜索引擎分词技巧
  2. 【算法导论】指针作为形式参数时 改变指针所指的值(二叉排序树)
  3. ORACLE的跟踪文件
  4. Populating Additional data in Material master record
  5. 文档比较比对工具Beyond Compare
  6. android (12) Fragment使用
  7. UVa 11889 (GCD) Benefit
  8. 有关send()和recv()函数的理解
  9. 北航|北京航空航天大学|介绍|简介
  10. linux java new date_Linux java Tomcat 项目中 new Date 获取时间 8小时 时差