A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

JDK 14即将在2020年3月17日正式发布啦!自JDK8正式启用之后,距离现在已经5年多时间了。5年时间里很多企业也都换上了JDK 8,随着JDK9-13的陆续发布,许多企业也进行了更新迭代,技术"尝鲜"。本次播妞为大家讲解JDK 14新特性的同时也准备了全网最全的JDK福利资源,帖子下方可见哦~
JDK 14官方计划
2019/12/12Rampdown Phase One (初始预备阶段)
2020/01/16Rampdown Phase Two(加速第二阶段)
2020/02/06Initial Release Candidate(初始阶段确定哪些新特性作为发行备选)
2020/02/20Final Release Candidate(最终确定哪些新特性作为发行备选)
2020/03/17General Availability(一般通用性,可视为发行出稳定版本的JDK新特性)
关于 JDK 14新特性预览相关介绍
JDK 14一共发行了16个JEP(JDK Enhancement Proposals,JDK 增强提案),即是筛选出的JDK 14新特性。
  • 305: instanceof 的模式匹配 (预览,预览版本意味着暂时可以先尝试)
  • 343: 打包工具 (Incubator)
  • 345: G1的NUMA内存分配优化
  • 349: JFR事件流
  • 352: 非原子性的字节缓冲区映射
  • 358: 友好的空指针异常
  • 359: Records (预览)
  • 361: Switch表达式 (标准)
  • 362: 弃用Solaris和SPARC端口
  • 363: 移除CMS(Concurrent Mark Sweep)垃圾收集器
  • 364: macOS系统上的ZGC
  • 365: Windows系统上的ZGC
  • 366: 弃用ParallelScavenge + SerialOld GC组合
  • 367: 移除Pack200 Tools 和 API
  • 368: 文本块 (第二个预览版)
  • 370: 外部存储器API (Incubator)
对于JDK 14新特性的深入理解
本次,我们来针对JDK 14准备发行的第一个显著新特性做一些讲解,让大家提前了解一下JDK 14其它新特性我们将在后期的视频中做详细的讲解梳理。稍候播妞也会将文档上传附件,大家可以直接在本帖上下载哦~
JEP 305: instanceof的模式匹配 (预览)
305: Pattern Matching for instanceof (Preview)
引入

JEP 305新增了使instanceof运算符具有模式匹配的能力。模式匹配能够使程序的通用逻辑更加简洁,代码更加简单,同时在做类型判断和类型转换的时候也更加安全,接下来我们来详细讲解一下。
设计初衷

几乎每个程序员都见过如下代码,在包含判断表达式是否具有某种类型的逻辑时,程序会对不同类型进行不同的处理。我么来看一下熟悉的instanceof-and-cast用法:
```java
// 在方法的入口接收一个对象
public void beforeWay(Object obj) {
    // 通过instanceof判断obj对象的真实数据类型是否是String类型
    if (obj instanceof String) {
        // 如果进来了,说明obj的类型是String类型,直接进行强制类型转换。
        String str = (String) obj;
        // 输出字符串的长度
        System.out.println(str.length());
    }
}
```

这段程序做了3件事:
  • 先判断obj的真实数据类型
  • 判断成立后进行了强制类型转换(将对象obj强制类型转换为String)
  • 声明一个新的本地变量str,指向上面的obj
这种模式的逻辑并不复杂,并且几乎所有Java程序员都可以理解。但是出于以下原因,上述做法并不是最理想的:
  • 语法臃肿乏味
  • 同时执行类型检测校验和类型转换。
  • String类型在程序中出现了3次,但是最终要的可能只是一个字符串类型的对象变量而已。
  • 重复的代码过多,冗余度较高。
JDK 14提供了新的解决方案:新的instanceof模式匹配 ,新的模式匹配的用法如下所示,在instanceof的类型之后添加了变量str。如果instanceof对obj的类型检查通过,obj会被转换成str表示的String类型。在新的用法中,String类型仅出现一次。
具体描述
示例代码:
```java
public void patternMatching(Object obj) {
    if (obj instanceof String str) {
              // can use str here
        System.out.println(str.length());
    } else {
        // can't use str here
    }
}

```

上述代码需要注意:
如果obj是String类型,则将obj类型转换为String,并将其赋值给变量str。绑定的变量作用域为if语句内部,并不在false语句块内。
接下来我们看一下它的另一个做法:
通常equals()方法的实现都会先检查目标对象的类型。instanceof的模式匹配可以简化equals()方法的实现逻辑。下面代码中的Student类展示了相关的用法。
```java
public class Student {
  private  String name ;

  public Student(String name) {
    this.name = name;
  }

//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Student student = (Student) o;
//        return Objects.equals(name, student.name);
//    }
   
  // 简化后做法!  
  @Override
  public boolean equals(Object obj) {
    return (obj instanceof Student s) && Objects.equals(this.name, s.name);
  }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

}
```

小结
instanceof运算符“匹配”规则如下:
  • 如果obj是String类型,则将obj类型转换为String,并将其赋值给变量str。绑定的变量作用域为if语句内部,并不在false语句块内。
  • 到这儿,有一定Java基础的同学应该看出来的JDK 14后的instanceof的模式匹配极大的简化了类型检查和转型的问题。
以上是对JDK 14的第一个显著新特性做的一些讲解,其他特性介绍播妞已上传附件,大家可以直接在本帖上下载哦~
JDK 14.zip (324.44 KB, 下载次数: 297)
其他特性介绍后续将会录制视频做详细的讲解梳理做详细的介绍,敬请期待哦~最后为大家赠送上本次的福利资源全网最全的JDK8-JDK12资源全套分享;
从JDK8到JDK12的资源以及妥帖备好,添加播妞QQ3414556270即可获取~
JDK8-JDK12资源截图
JDK8-JDK12对应源码资料
对Java开发人员来说,最重要的无疑是:switch语句、文本块,intanceof的模式匹配操作,JDK 14还有更多的JEP新特性,我们将在后续的视频资源中做进行进一步的详细深入介绍,播妞也会及时为大家提供最新资源的,请大家持续关注哦!

7 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
蒋志豪 来自手机 中级黑马 2020-8-11 13:14:06
7#
好好学习天天向上,加油
回复 使用道具 举报
cn_abc 金牌黑马 2020-8-31 08:40:49
8#
好好学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马