2020年3月17号oracle发布了Java14,今天我们来尝尝鲜,看看新发布的版本都有一些什么新特性,首先我们在oracle官方网站上下载JDK14,(https://www.oracle.com/java/technologies/javase-downloads.html),进入之后如下图所示:
我们点击下载,即可下载JDK14,下载完成之后点击安装即可,需要要注意的是要把环境变量修改成我们安装的Java14的路径,如果没安装过jdk的话可以忽略,安装成功之后打开命令行,输入java -version 查看效果:
当显示出了Java 的版本为14的时候就表示安装配置成功了。
好了,由于Java14的版本比较新,我用的集成开发工具的版本没跟上,本次使用文本编辑器作为演示。
首先我们打开官网上的文档主页(https://docs.oracle.com/en/java/javase/14/)进入之后的页面如下图所示:
首先我们点击总览选项卡里的Release Notes,进入到以下界面:
从上图中可以看到本次更新主要分为3个部分,首先是JDK新增的特性和对部分功能增强的,接着就是删除的一部分(api)功能以及官方不推荐使用的api。首先,我们先点击上图中第二个选项,What's New in JDK 14 - New Features and Enhancements,进入一下界面:
不小心截图截多了,大家先重点查看第一段话,概的意思就大是 该章节主要描述JDK14新增的一些功能,描述Java SE 14和JDK 14中的一些增强。一般情况下,这些描述提供了关于某个问题或更改的附加详细信息的解释。但是下面描述的api是Oracle JDK附带的api。它包括Java SE 14平台的完整实现。关于Java SE 14和JDK 14中的重要增强和新特性的另一个信息来源是Java SE 14 (JSR 389)平台规范,它记录了在Java SE 13和Java SE 14之间对规范所做的更改。本文档包括对规范的新特性和改进的描述。这些描述还确定了迁移到JDK 14时可能遇到的潜在兼容性问题。
在这段话里有个信息是JSR389,我们发现他是个超链接,毫无疑问我们肯定要点进去看看,点击进入之后的界面如下:
关于JSR大家可能会有疑问,这里解释一下他的全称是Java Specification Requests,意思是Java规范提案,是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。多年以来JSR已成为Java界的一个重要标准。好了我们打开上述界面之后发现主要就是JSR389提出者对JSR389的一个简单的介绍,首先我们点击 Summary,查看该提案的摘要部分,如下图所示:
大概的意思就是 该版本继续改进平台,以确保核心Java技术获得尽可能广泛的成功。它对switch表达式进行了标准化,预览了其他几个语言特性,并删除了Pack200 API。我们似乎没看到啥有用的东西,emmmm.......原谅我的英文水平。。想了一下,我们是来探索Java14的新特性的,我们难道不应该首先点击特性的链接嘛,好了,我们直接点击上图中第五个超链接features,来到新特性的页面:
我们重点来看我吐了颜色的那句话,意思是:Java SE 14参考实现中包含一些功能,它们是预览功能(preview),同时我们也注意到了有个专业名词JEP,好了,在探索新特性之前再给大家科普一下JEP,他的全称是JDK Enhancement Proposals意思是Java增提案,JDK的版本发生的变化将会从这些提案中选取。好了,大家可能注意到了下面的几项内容
大家可能注意到了小括号里的内容了,第一个和第二个特性是Preview,第三个switch表达式是Standard,一个是预览,一个是标准,那么有什么区别呢,我们接下来一个一个的去查看,首先我们点击instanceof的模式匹配下面的JEP 305超链接,我们发现我们进入如下的页面,
这里会发现我们来到了这个叫openjdk的一个网站了,其实我们在点击oracle官方文档上的JSR389那个超链接的时候我们就已经来到了openJDK 的官网了,好了,正式的探索现在开始!!!!
你们可能会好奇OpenJDK这个网站是做啥的,这里先简单说一下,他是早期由Sun公司发起的一个开源社区,一般jdk版本更新之前都会在该社区发布一些重要的更新信息。上面就是本人当年是怎么发现的openJDK这个网站的的过程,关于openJDK的讨论以后有空再和大家聊,接下面我们先来到页面上,先往下拉页面,找到左侧的JDK版本信息,如下图:
。
我们点击14这个数字,来到Java14的更新页面:
我们可以看到上述一共有16个Feaatures,也就是说本次的版本更新主要有16条,好了我们先来看JEP305,点击第一个 超链接就来到了该特性的介绍界面,首先我们先来看这个部分:
上图中这段代码大家想必都不陌生吧,其中在springframework中就有很多的使用,例如下面这段代码:
这段代码是org.springframework.context.annotation.AnnotationBeanNameGenerator 这个类中的一部分,感兴趣的可以自己去研究一下,这里主要想给大家的解释是,instanceof这个关键字在java14之前都是先判断是否是同类型的对象(包含父子类),如果是的就强制转换类型,然后再进行一系列的操作。
好了,在Java14中认为这种处理方式太low了,不够简洁优雅,于是就有了一种新的用法
好了,打开我们的记事本,我们来尝尝鲜。
public class InstanceOfInJava14Demo
{
public static void main(String[] args){
Object str = "hello java14";
if(str instanceof String){
System.out.println((String)str);
System.out.println("长度是:"+((String)str).length());
}
}
}
在Java14之前我们是这样用的, 我们在命令行编译执行之后将结果如下:
好了,这里不做多的解释,在Java14中认为,既然str本来就是字符串,为什么还要在强转之前先做判断呢,接下来我们来看下Java14是怎么处理的。
public static void main(String[] args){
Object str = "hello java14";
if(str instanceof String s){
System.out.println(s);
System.out.println("长度是:"+s.length());
}
}
我们将上述代码稍作修改, 就是Java14中提出的方法,有没有发现更加简洁优雅。接着我们开始编译,输入javac之后发现出现了问题
我们根据提示信息发现该新特性是预览版的,JDK默认是禁用了该功能,根据提示我们使用 --enable-preview参数来进行编译
好吧,又报错了,该参数必须要带上-source或者--release一起使用,emmm。。。。。。。。。这是什么玩意儿。先不管了,跟着提示信息来呗,
很遗憾,似乎还是报错了,但是我们可以看到,可以使用--help 来列出可能的选项 。我们继续输入javac --help
我们看换颜色的部分,原来这个参数的意思是指定java 的编译的时候使用的版本,好了,我们指定版本之后再继续编译:
似乎有提示信息,但是不是报错的信息,应该是编译成功了。我们接着来运行一下试试:
似乎有点难受,我们根据提示继续运行一把,
好了,终于成功了!我们发现这样写确实可以。下面给出Java14中详细的用法。
import java.util.Objects;
public class InstanceOfInJava14Demo
{
/*
public static void main(String[] args){
Object str = "hello java14";
if(str instanceof String){
System.out.println((String)str);
System.out.println("长度是:"+((String)str).length());
}
}
*/
/*
public static void main(String[] args){
Object str = "hello java14";
if(str instanceof String s){
System.out.println(s);
System.out.println("长度是:"+s.length());
}
else{
//s在这里是失效的,不能访问
}
}
*/
/*
if (!(obj instanceof String s)) {
// 这里不能访问s
} else {
System.out.println("第二个分支:"+s.length()); // 能访问s
}
*/
public static void main(String[] args){
Feature feature = new Feature("java14");
Feature feature2 = new Feature("java14");
System.out.println(feature.equals(feature2));//true
}
}
class Feature {
private String name ;
public Feature(String name) {
this.name = name;
}
// @Override
// public boolean equals(Object o) {
// if (this == o) return true;
// if (o == null || getClass() != o.getClass()) return false;
// Feature feature = (Feature) o;
// return Objects.equals(name, feature.name);
// }
// 简化后做法!
@Override
public boolean equals(Object obj) {
return (obj instanceof Feature s) && Objects.equals(this.name, s.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
接下来,我们继续回到文档上,我们点击JEP(343)Packaging Tool
根据描述我们知道这是Java14中提供了一个打包的工具,以Windows为例,在之前的版本中我们都是借助第三地方的工具进行打包成可执行的软件包(.exe),现在不需要了,我们使用Java14可以方便的使用JDK自己的命令进行打包了。 具体的用法如下:
好了,我们接着来看下一个新特性JE361 Switch Expressions (Standard),不知道大家有没有发现这个特性有点不同,后面的括号里写的是standard,而不是preview.好了我们来看他的具体用法:
public class SwitchInJava14Demo
{
public static void main(String[] args){
int day = 7;
//Java14 之前的用法
/* switch (day) {
case 1:
case 2:
case 3:
System.out.println("变量的值小于4");
break;
case 4:
System.out.println("变量的值等于4");
break;
case 5:
case 6:
System.out.println("变量的值小于6");
break;
case 7:
System.out.println("变量的值等于7");
break;
}
*/
//Java14之后的使用、
switch (day) {
case 1, 2, 3 -> System.out.println("变量的值小于4");
case 4 -> System.out.println("变量的值等于4");
case 5, 6 -> System.out.println("变量的值小于6");
case 7 -> System.out.println("变量的值等于7");
}
}
}
我们使用javac命令进行编译,发现是成功的,并且还可以常规的正常运行,并没有使用 --enable-preview参数。
现在大家应该有点感觉了吧。知道了小括号里面的Preview和Standard区别了吧 。也就是说带有Preview的特性只是一个预览版的,给大家尝尝鲜,JDK默认关闭了该功能。而Standard的是一种已经落实了的新特性,默认是开启的,官方推荐使用的。预览版的特性一般会在后面的版本中变成Standard的。
好了,我们继续回到文档上,我们来看JEP368, Text Blocks
该特性主要是对字符串拼接做出了优化,设计的初衷是我们Java代码中嵌入HTML,XML,SQL或JSON片段的时候,通常需要先进行转义和拼接的大量编辑,然后才能编译包含该片段的代码。该代码段通常难以阅读且难以维护, 早在Java13中提出了,现在在Java14中做出了优化的方案,并且有很大可能性成为未来Java的标准。
下面就是就是具体的用法:
public class TextBlockInJava14Demo
{
public static void main(String[] args){
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
System.out.println(html);
//Java14 的方法
String html2 = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
System.out.println(html2);
}
}
好了,上述代码需要带参数进行编译,大家应该发现了使用Java14来撸代码是不是更加的简洁更加的优雅了。我们接着回到文档上,
今天主要给大家介绍了上面的5条新特性,其中 我们可以看到JEP363、JEP364、JEP365、JEP366都是和垃圾收集器相关的。相信CMS大家应该都知道,不过很遗憾。在Java14中删除了CMS。其中在macOS和Windows平台上支持了ZGC。
对于ZGC大家可能比较陌生,他是在Java11中首次引入的,被称为未来的、革命性的垃圾回收器,但是在之前的版本中仅仅只支持Linux平台,在Java14 中同时支持了macOS和Window是了。这里简单介绍一下,在《深入理解Java虚拟机》这本书中说:ZGC收集器是一款基于Region内存
布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-压缩算法的, 以低延迟为首要目标的一款垃圾收集器。看不懂吧!!emmmmmm........................
好了,关于垃圾收集器(现在技术太菜了,自己也不懂)以后单独再给大家介绍 。关于Java14的新特性就先给大家介绍到这里了,后续的大家可以查看文档进行学习。