1.Why:谁来挽救我的长发

在Java 6之前,JDK版本升级节奏比较慢,Java程序猿对Java语言本身的学习压力较小(具体体现在"频率低"和"资源多”):

  • 频率低:如果已经掌握了Java 6或之前的某个版本,那么学习Java新版本也不那么紧迫。
  • 资源多:如果您阅读英文资料有点困难,那么等一段时间后,Java新版本的中文资料非常多。

然而,随着Oracle完成收购Sun和JRockit,Oracle宣布Java将按照每半年发布一个版本,每三年发布一个LTS版本的节奏小步快跑

Java这种快速迭代的版本节奏,给Java程序猿带来了学习新知识的负担。这种学习负担,通常在产品中表现出2种现象:

  • 现象1:Java程序猿并未掌握好7年前发布的Java8的众多新特性。

2014年3月,Java8发布。7年过去了,依然还有很多Java程序猿没有真正掌握Lambda表达式&Stream等Java 8的新特性。

  • 现象2:市面上的Java新特性资料,少有做到"全面”、“条理”、“及时”

笔者所在的公司曾邀请业界一些咨询公司来讲解Java11的新特性,效果不尽如人意。或只是对Java11新特性的罗列,或过于强调某些单点新特性(如:“模块化”),甚至部分新特性的阐述与Oracle最新文档是矛盾的。

终于,Oracle的版本节奏,成为带走Java程序猿飘飘长发的一个新的因素。。。

image-20210820192105074

如何高效率地学习Java新特性呢?

如何挽救我们的长发?

笔者试图通过本文,探讨快速自学Java新特性的方法,希望这篇文章能挽救你我的一头秀发。

image-20210821233636736

2.What:什么是JEP/JSR

我们先来看一下Java 8至今的项目里程碑:

2014.3,Java8发布

2017.9.21,Java9发布

2018.1.16,Java9.0.4发布

2018.7.17,Java10.0.2发布

2019.1.15,Java11.0.2发布->2021.7.20,Java11.0.12发布

2019.7.16,Java12.0.2发布

2020.1.14,Java13.0.2发布

2020.7.14,Java14.0.2发布

2021.1.19, Java15.0.2发布

2021.7.20,Java16.0.2发布

其中,Oracle从Java9开始,每个版本的发布周期是6个月,每个LTS版本发布周期是3年。

从Java9以后的版本看,Oracle的确严格执行了6个月准时发版本的承诺。

一个有趣的事件是:Java9的正式发布与Java8相隔了4年。

并且由于多次跳票一度动摇了业界对Java的信心,那阵子Java恶评如潮。

不过仔细阅读了Java9的新特性列表,我们可以发现Java9新增了非常多的新特性,它们为后续的Java11奠定了坚实的基础。

Oracle的确把吹过的牛逼实现了,实现的还挺彻底。

image-20210821234525704

帮助Oracle准时发版本的背后就是JSR、JSR:

  • JEP:JDK Enhancement Proposals,JDK改进提案

为Java增加新特性,可以向JCP(Java Community Process)提交JEP,即JDK改进提案。

通过评审的JEP将列入新版本的Java开发计划,并且明确具体落地的Java版本。

  • JSR:Java Specification Requests,Java规范提案。

为Java增加新特性的另一个途径是向JCP提出一个新的、正式的规范(Specification),纳入到《Java Specification》或者《JVM Specification》。

我们可以把JEP、JSR简单理解为Oracle管理Java新特性的需求清单,

需求清单中每条需求都会被专门的组织评审并确定落地版本,Java9的JEP列表如下图:

image-20210822002010521

当然,这又引出了新的问题:JEP列表只是"平铺直述"地罗列了该Java版本中的新特性,我们如何高效、有条理地阅读和理解JEP列表呢?

3.How:梳理JEP列表

3.1.编程语言的知识脉络

3.1.1.Java语言的知识脉络

大部分现代编程语言(如:C++、Java等),其包含的技术点可以按照分为3个层次:

  • 语言语法:编程语言定义的一套语言语法规则。

  • 类库:编程语言通常提供给程序猿的类库,类库也可以分为两个小类:

    • 核心类库:基于该语言语法实现的类库。
    • 扩展类库:基于核心类库实现的更高级的类库。
  • 编译器与调优:编程语言的编译器(或解释器)会提供一些编译选项、运行时参数,程序猿可以根据自己的场景提升应用软件的运行效率。

具体到Java,细化具体的技术点:

  • 语言语法:声明与初始化、数据类型、表达式、控制语句、方法、面向对象、异常、代码组织结构
  • 核心类库:集合与泛型、多线程编程、反射
  • 扩展类库:IO编程、数据库编程、网络编程、安全类库、正则表达式……
  • JVM:字节码结构&前端编译器、类加载、运行时数据区、垃圾回收算法与垃圾收集器、JIT&AOT、工具链

上述编程语言的知识脉络,基本覆盖了Java程序猿在Java语言领域比较完整的技术栈。

假设一个Java程序猿小明,

首先,熟练掌握了Java语言语法,就能开始编写一个产品的业务逻辑代码了。

进一步,熟练掌握了Java核心类库Java扩展类库,就能从开发效率、安全性、性能三方面,提升这些业务逻辑代码的质量。

再进一步,深刻理解JVM,就能看到这些业务逻辑代码在Java虚拟机内部的执行过程,进而从更高的维度、更高级的手段解决Java代码的疑难杂症、安全性、性能问题。

3.1.2.JEP与Java语言知识脉络的关系

回到JEP列表,每一个JEP,都会标注这个需求单所属的组件,即改进了Java的哪一类技术点,也能与上述编程语言的知识脉络一一对应。

比如:JEP 110,就是在改进了扩展类库-网络编程技术点。

image-20210822073959702

笔者以Java9的JEP列表为例,

在按照编程语言知识脉络分类前,很难从技术点的罗列中,看出Java9新增的91个新特性到底对Java8有哪些方面的改进

image-20210822074441769

按照编程语言知识脉络分类后,可以很清晰地看到Java9在4个方面的改进:

  • 语言语法:

    • 表达式:钻石表达式升级
    • 面向对象:接口的私有方法
    • 代码组织:支持了模块化——★大改进
      • 其中,模块化特性影响了Java的N个模块,涉及好多条JEP,这也是Java9变化最大的特性。
  • 核心类库:

    • 集合与泛型:提供了of方法
    • 多线程编程:提升了多线程编程部分类库API的性能
    • 反射:增强了MethodHandle
  • 扩展类库:

    • IO编程:优化了Xml类库的内部实现,提升了安全性
    • 安全类库:更新了安全算法、证书、密钥库等——★大改进
    • Js引擎:引入了Nashorn——★大改进
    • GUI编程:升级了JavaFx——★大改进
  • JVM:——★大改进

    • 字节码格式:字符串相加生成的字节码优化,提升性能
    • 运行时数据区:字符串的存储结构发生了变化,提升性能
    • GC:G1上位、CMS下台、废弃某些垃圾收集器组合,提升性能
    • JIT&AOT:优化C1/C2、支持更多平台,提升性能与JIT性能
    • 工具链:规范/细化javac的编译告警,提升前端编译器分层归因性能

image-20210822081029823

3.1.3.从梳理后的JEP列表,宏观理解新版本Java

基于梳理后的JEP列表,我们可以清晰地宏观理解新版本Java,还是以Java9为例:

  • 看Oracle的商业意图:

期望占据"模块化"的标准话语权。

期望在Js引擎、GUI编程上发力(但从Java10、Java11看,这两个领域都放弃了)。

期望强化垃圾回收器和JIT的地位。

  • 看技术意图:

在性能方面,Oracle做了不少底层优化,如果Java程序猿合理利用即可获得比较好的性能提升。

在安全方面,Oracle也默默地做了很多底层工作,如果Java程序猿合理利用即可获得比较好的安全提升。

在语法方面,Oracle基于Coin项目,添加了若干更加便捷的语法小优化。

因此,我们很容易判断出Java程序猿应该学习哪些Java9的新特性:

  • 性能方面:要重点掌握多线程编程的底层优化、JIT底层优化、字符串优化的原理,对产品性能有帮助。
  • 语法方面:要重点掌握模块化新特性,对产品升级到Java9有比较大的影响。
  • 语法方面:要熟练掌握语法小改进,对产品开发效率有帮助。
  • 安全方面:了解改动点的基本原理即可,在产品开发中不要错误使用即可。

3.2.梳理Java9/10/11的JEP列表

接下来,笔者将Java9、Java10、Java11的新特性按照上述方法进行梳理,后续再详细解读各新特性:

3.2.1.Java9新特性

image-20210822081029823

3.2.2.Java10新特性

image-20210822083115018

3.2.3.Java11新特性

image-20210822083247655