✍前言

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]
YourBatman18

注意:此特性在「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 USERWHERE `id` = 1ORDER 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等,这么一来我们就可以放心大胆的使用啦。

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

  1. java基础学习整理(一)

    java基础学习整理(一) lesson1: D0s命令: 1.回到根目录,>cd \ 2.复制命令行下的内容,右击标记所要复制的内容,这样就已经复制好了,右击粘贴就可以了. 3.查看,设置环境 ...

  2. 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结

    Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 4.1 class作为成员变量 4.2 interface作为成 ...

  3. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  4. java基础学安卓开发_Android开发学习路线之Java基础学习

    原标题:Android开发学习路线之Java基础学习 很多Android学习开发者刚入手Android开发技术时,稍微有点迫切.任何的开发技术都有其基础语言,Android应用程序开发是以Java语言 ...

  5. Java基础学习:尚硅谷项目三 开发团队调度软件

    Java基础学习:尚硅谷项目三 开发团队调度软件 一.软件功能与结构设计 1. 软件功能 该软件实现以下功能: 软件启动时,根据给定的数据创建公司部分成员列表(数组) 根据菜单提示,基于现有的公司成员 ...

  6. Java基础学习汇总

    Java基础学习汇总 java语言基础 java函数和数组 java面向对象 java异常 整理用,早就停更... 写作不易,如果您觉得写的不错,欢迎给博主点赞.收藏.评论.收藏来一波~让博主更有动力 ...

  7. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  8. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  9. Java基础学习(9)

    Java基础学习 一.常用方法(API) 1.1 Math 1.2 System 1.3 Runtime 1. 4 .object 1.5 Objects 1.6 BigInteger BigInte ...

  10. java基础小记_[Java教程]Java基础学习小记

    [Java教程]Java基础学习小记 0 2016-10-07 18:00:07 题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓"早起毁一天"不是没有道理哪 ...

最新文章

  1. netty集成ssl完整参考指南(含完整源码)
  2. PDU知识全集,值得收藏!
  3. python段错误原因_python – 捕获崩溃的子进程的“分段错误”...
  4. 使用函数指针实现父类函数调用子类函数的两种方式
  5. require无法使用变量_被框架玩坏的孩子们浏览器环境下使用require
  6. 国外知名的技术网站、社区
  7. 白盒测试用例设计方法
  8. python中安装pip_Python中如何安装pip-百度经验
  9. 计算机科学技术技术的发展趋势,计算机科学与技术的发展趋势分析
  10. 淘宝购买win10激活码流程
  11. 《微信小程序进阶实战之分答应用开发(中级项目)》(完整版)
  12. 16 款基于jQuery的图片缩放效果插件推荐
  13. 可以刻录在cd中的linux,在Linux下刻录CD/DVD
  14. linux chsh命令参数及用法详解(linux设置系统shell命令) 详细出处参考:http://www.jb51.net/LINUXjishu/57945.html
  15. Https环境将key秘钥和crt格式证书转成cer证书
  16. python安装第三方包遇到的一些问题
  17. 国税局发票查验中英文验证码识别,识别率95.2%
  18. 华为eNSP模拟酒店无线wifi实验
  19. Coursera 国内无法登陆问题
  20. 生产API版本及SIMNOW环境说明

热门文章

  1. mysql教程丿it教程网_1.0MySQL基础入门【DQL部分】
  2. 手写 Object.create
  3. 10g数据库入门与实践 oracle_修改oracle数据文件大小 报错:ORA-03297
  4. 多域名linux面板,宝塔面板操作多个域名做301跳转
  5. python airflow_airflow 简明指南
  6. C++STL笔记(十一):priority queue(带优先级的队列)详解
  7. C++头文件<functional>和bind、placeholders占位符使用简单例子
  8. C语言 neutralize函数,关于因子数据处理函数中的中性化函数的几个问题
  9. debugger怎么用_谷歌开发者工具,这些技巧你用过么?
  10. C++安全方向(三):3.7 使用openssl_evp接口完成SHA3和国密SM3