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程序猿飘飘长发的一个新的因素。。。
如何高效率地学习Java新特性呢?
如何挽救我们的长发?
笔者试图通过本文,探讨快速自学Java新特性的方法,希望这篇文章能挽救你我的一头秀发。
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的确把吹过的牛逼实现了,实现的还挺彻底。
帮助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列表如下图:
当然,这又引出了新的问题: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,就是在改进了扩展类库-网络编程
技术点。
笔者以Java9的JEP列表为例,
在按照编程语言知识脉络分类前,很难从技术点的罗列中,看出Java9新增的91个新特性到底对Java8有哪些方面的改进:
按照编程语言知识脉络分类后,可以很清晰地看到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的编译告警,提升前端编译器分层归因性能
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的新特性按照上述方法进行梳理,后续再详细解读各新特性: