JDK15正式发布,划时代的ZGC同时宣布转正
作者:BAT的乌托邦
原文链接:

文章图片
2020年9月15日 , JDK15正式发布 , 可谓如约而至 。 按照JavaSE的发展路线图 , JDK14自此停止更新 。 值得注意的是JDK15并非「LTS」版本 , Oracle官方对JavaSE的支持路线图如下:

文章图片
JDK8的扩展支持时间超过了JDK11 , Oracle你是认真的吗?开个玩笑~
那么自Java11之后 , 哪个版本才是LTS版本呢?Oracle官方并没给出具体参考路线图 , 但可参考OpenJDK的这张:

文章图片
可以看到「JDK17」将是下一个LTS版本 , 预计发版日期是2021年9月份 。 当然喽这只是OpenJDK的发版线路图 , 并不代表Oracle官方 , 因此仅供参考 , 不过一般八九不离十 。
?
小贴士:OpenJDK和OracleJDK自从JDK11后 , 就共享了绝大部分代码了 , 节奏基本保持一致 。
?
从JDK9之后 , Oracle采用了新的发布周期:每6个月发布一个版本 , 每3年发布一个LTS版本 。 JDK14是继JDK9之后发布的第四个版本 , 该版本为非LTS版本 , 「最新的LTS版本为JDK11」 。 因为是小鹿快跑 , 快速迭代 , 因此此处解释下这两个词:孵化器模块(Incubator)和预览特性(Preview) 。
尚未定稿的API/工具 , 主要用于从Java社区收集使用反馈 , 稳定性无保障 , 后期有较大可能性移除
规格已成型 , 实现已确定 , 但还未最终定稿 。 这些特性还是存在被移除的可能性 , 但一般来说最后都会被固定下来 。
JDK15是JavaSE平台的第15个版本 , 由「JSR390」在Java社区进程中指定 。
?
OpenJDK15是9-15发布的 , Oracle同步跟上 。 其它厂商的对应JDK版本也会随后跟上
?
该版本共提供14个新特性 , 通过这些JEP来表示 , 截图如下:

文章图片
下面针对其中对开发者日常编程关系较大的特性拉出来解释 , 并给出对应的使用示例(其实就是JEP378喽) 。
老规矩 , 在进行JDK15的新特性介绍之前 , 先回顾下JDK14的主要特性有哪些 。 JDK14于2020年3月17日发布 。
新的Switch表达式其实早在JDK12、13中都已存在了 , 但只是「预览版」 , 到了JDK14就彻底变为稳定版了 , 可以放心商用 。
?
小贴士:预览版特性是有可能在后续版本中被移除的 , 但稳定版后几乎不可能被移除
?
switch新的表达式有两个显著的特点:
支持箭头表达式返回支持yield和return返回值 。JDK14之前写法:
privatestaticvoidprintLetterCount(DayOfWeekdayOfWeek){switch(dayOfWeek){caseMONDAY:caseFRIDAY:caseSUNDAY:System.out.println(6);break;caseTUESDAY:System.out.println(7);break;caseTHURSDAY:caseSATURDAY:System.out.println(8);break;caseWEDNESDAY:System.out.println(9);break;}}要点:break可千万别忘记写 , 否则就是个大bug , 并且还比较「隐蔽」 , 定位起来稍显困难 。
JDK14等效的新写法:
privatestaticvoidprintLetterCount(DayOfWeekdayOfWeek){switch(dayOfWeek){caseMONDAY,FRIDAY,SUNDAY->System.out.println(6);caseTUESDAY->System.out.println(7);caseTHURSDAY,SATURDAY->System.out.println(8);caseWEDNESDAY->System.out.println(9);}}可明显看到新写法不需要一个个break了 , 从「语法层面」规避了我们犯错的可能性 。
JDK14之前写法:
privatestaticintgetLetterCount(DayOfWeekdayOfWeek){intletterCount;switch(dayOfWeek){caseMONDAY:caseFRIDAY:caseSUNDAY:letterCount=6;break;caseTUESDAY:letterCount=7;break;caseTHURSDAY:caseSATURDAY:letterCount=8;break;caseWEDNESDAY:letterCount=9;break;default:thrownewIllegalStateException("非法:"+dayOfWeek);}returnletterCount;}JDK14等效的新写法:
privatestaticintgetLetterCount(DayOfWeekdayOfWeek){returnswitch(dayOfWeek){caseMONDAY,FRIDAY,SUNDAY->6;caseTUESDAY->7;caseTHURSDAY,SATURDAY->8;caseWEDNESDAY->9;};}使用箭头操作符操作效果立竿见影 。 当然 , 你还可以使用yield关键字返回:
privatestaticintgetLetterCount(DayOfWeekdayOfWeek){returnswitch(dayOfWeek){caseMONDAY->6;default->{intletterCount=dayOfWeek.toString().length();yieldletterCount;}};}该功能在JDK14中处理「预览版」 。
JDK14之前写法:
publicstaticvoidmain(String[]args){Objecto="helloworld";if(oinstanceofString){Stringstr=String.class.cast(o);System.out.println(str);}}JDK14等效的新写法:
publicstaticvoidmain(String[]args){Objecto="helloworld";//屁股里直接可写个变量名 , 不再需要强转了if(oinstanceofStringstr){System.out.println(str);}}再如:if(objinstanceofStrings&&s.length()>5){s.contains(..)}如果你运行时有如下错误:
java:instanceof中的模式匹配是预览功能 , 默认情况下禁用 。 (请使用--enable-preview以启用instanceof中的模式匹配)那是因为此功能是「预览特性」 , 需要你主动开启 , 如下:

文章图片
注意:此特性在「JDK15」中依旧为预览版 。
略 。
Java年纪太大 , 语法不够新潮 , 有时候确实太麻烦 , 因此有了Record的出现:干掉那些get/set、toString、equals等方法 。
publicrecordPerson(Stringname,Integerage){}publicstaticvoidmain(String[]args){Personperson=newPerson("YourBatman",18);System.out.println(person);System.out.println(person.name());System.out.println(person.age());}运行程序 , 结果打印:
Person[name=YourBatman,age=18]YourBatman18注意:此特性在「JDK15」中依旧为预览版 。
这个特性可是非常好用 , 它属于二次预览:已在JDK13预览过一次 。
publicstaticvoidmain(String[]args){Stringhtml="""【JDK15正式发布,划时代的ZGC同时宣布转正】helloworld
""";Stringquery="""SELECT*fromUSERWHERE`id`=1ORDERBY`id`,`name`;""";}
在JDK13中 , 这种是「有」换行的 。 在JDK14中 , 可以加上一个符号让其不让换行:
publicstaticvoidmain(String[]args){Stringquery="""SELECT*fromUSERWHERE`id`=1ORDERBY`id`,`name`;""";System.out.println(query);}运行程序 , 输出(可以看到展示为一行了):
SELECT*fromUSERWHERE`id`=1ORDERBY`id`,`name`;注意:此特性在「JDK15」中已经为正式版 。
这款著名的垃圾回收器从这个版本就彻底被删除了 。 JDK9开始使用G1作为「默认」的垃圾回收器(JDK11中ZGC开始崭露头角) , 就已经把CMS标记为过期了 , 在此版本正式删除 。
推荐阅读
- 三星堆遗址|直击三星堆发布会|雷雨:四号坑灰烬中发现纺织品痕迹
- 新冠疫苗|新冠疫苗需要打几针?哪些人群不能接种?长沙疾控权威发布!
- 高血脂|聚焦2021CROI大会,发布多项关于日常服药引发血脂问题的研究
- 新冠病毒|新冠病毒联合溯源研究报告发布前,中方专家组组长释放大量信息
- nasa|NASA发布“毅力号”在火星发射激光的录音
- 新冠病毒|健康新知|英国新冠病毒人体挑战试验已正式开始,这种试验是什么概念?
- 运载火箭|航天民企火箭派发布首型液体运载火箭达尔文一号,明年底首飞
- 青岛|青岛发布大雾黄色预警!3股冷空气!降雨马上到!
- 草地贪夜蛾|今年草地贪夜蛾预计见虫面积4000万亩 防控方案发布
- 神经网络|科学家发布惊人理论:宇宙可能是一个巨大的神经网络,真是活的?
