Java9命运多舛,一次次跳票(据说经历了4次跳票),极大地影响了Java开发者的信心。

在·www.reddit.com·上,能看到诸如: ‘Java 9, it did break some things,’ Oracle bod admits to devs still clinging to version 8这类讨论,这些讨论中充满了Java开发者的不安与焦虑。

但这些讨论过于强调Java9的某些单点特性和跳票本身。

显然,不是局部特性的成败,就能决定Java9的成败。

显然,不是所有的跳票,都不能留给人悬念。

image-20210830095628354

笔者在《【Java新特性】-0-学习Java新特性,如何快人一步》中分享了一种快速学习Java新特性的方法,本文将采用这种方法,对于Java9新特性的全貌进行解读。

1.Java9新特性全貌

Java9的新特性覆盖了四个方面:

  • 语言语法

  • 核心类库

  • 扩展类库

  • JVM

Java9新特性

2.语言语法

2.1.JEP

JEP涉及的改进包括:

  • 声明与初始化:下划线”_",不再是合法字符。
  • 数据类型:字符串的内部存储结构发生了变化,用于减少存储空间。
  • 面向对象:接口支持了私有方法。
  • 异常:try-with-resources中,支持在try之前定义try()中的资源相关的变量。
  • 代码组织方式:增加了模块化——这也是Java9最大的新特性,也是饱受争议的新特性。

从上述新特性,可以看出我们学习的重点:

  • Java依托Coin项目,持续地对基础语法进行小改进,我们及时了解这些改进,有助于提升我们实战中的编码效率。
  • Java克服重重阻力,重点推出了模块化。如何熟练使用模块化、如何平滑迁移现有软件产品都是我们的重点研究方向。

说明:Coin项目是Java团队针对Java语言语法的改进专项,其中吸收了不少从其它现代编程语言中吸收的有趣语法特性,即使这些改进不一定都会在Java中落地,了解它们也能看到在现代编程语言中的广受欢迎的语法特性、语言设计思想。

语言语法-JEP

2.2. Issues

Java9在语言语法方面的其它小改进:

  • 数据类型:主要是API层次的改进
    • 增强包装类的parse方法,如:parseInt()
    • 修改String、StringBuilder、StringBuffer的实现,如:字符串连接,如:修复了indexOf方法的Bug
    • 加强java.lang.Math,如:增加了fma(),如:增加了floorDiv()、floorMod()、multiplyExact()
    • 加强了BigDecimal/BigInteger,如:增加了BigDecimal.sqrt()

从上述新特性,可以看出我们学习的重点:

  • 查阅这些新增或修改的API的用法,编写测试代码用来留下大致印象,思考实战中能使用这些新API的场景。

说明:除了通过JEP可以看到新版本Java的变化,还可以通过JDK Bug System(https://bugs.openjdk.java.net/)识别出新版本Java的改动。

语言语法-JDKx

3.核心类库

3.1.JEP

JEP涉及的改进包括:

  • 集合与泛型:新增了of方法,便于简化创建集合的代码。
  • 多线程编程:主要针对API底层实现的修改,用来提升线程相关性能,如:提升存在竞争的对象锁的性能,如:自旋循环提示。
  • 反射:增加了MethodHandle。

从上述新特性,可以看出我们学习的重点:

  • 重点学习集合与泛型新增的API,有助于提升开发效率。
  • 了解MethodHandle相关API,有助于编写更有技巧性的代码。

核心类库-JEP

3.2. Issues

Java9在核心类库的其它小改进:

  • 集合与泛型:Collections包有少量优化,新增了一些Stream的API——重点。
  • 多线程编程:优化了java.util.concurrent。
  • 反射:优化了java.lang.invoke。

从上述新特性,可以看出我们学习的重点:

  • 熟练StreamAPI的优化,提升开发效率。
  • 熟悉juc包的变化,增强并发编程能力。

核心类库-JDKx

4.扩展类库

4.1.JEP

JEP涉及的改进包括:

  • IO编程:增强了ProcessAPI

  • 网络编程:提供新的HttpClient接口

  • 安全类库:增强了加密算法/密钥等

  • 其它类库:如:Nashorn引入和增强,废弃Applet/增强JavaFx,日志库增强等

从上述新特性,可以看出我们学习的重点:

  • 熟悉新的ProcessAPI、HttpClient,思考实战中使用场景。

说明:对于进程相关的库,没有找到更合适的归类方法,暂时放在IO编程分类了。

扩展类库-JEP

4.2.Issues

Java9在扩展类库的其它小改进:

  • 修改了IO & NIO对应的API及其底层实现,用来提升性能和健壮性——这是学习的重点。
  • XML相关API的内部实现升级。

从上述新特性,可以看出我们学习的重点:

  • 熟悉IO & NIO新的API,以便提升IO编程相关性能。

扩展类库-JDKx

5.JVM

5.1.JEP

JEP涉及的改进包括:

  • 编译引擎&类加载:模块化导致的双亲委派模型的变化,字符串相加的字节码优化。
  • 运行时数据区:CDS内存存储字符串的优化,提供栈遍历API。
  • GC:将G1作为默认的垃圾回收器、将CMS以及配套的垃圾回收器组合废除——这也是JVM特性最大的改动。
  • 执行引擎:持续优化C1&C2编译器、增加了AOT编译器
  • 工具链:增加了jshell、废弃jhat、小改进了javac/java/javadoc等
  • JVMTI/JVMCI:增加了JVMCI接口

从上述新特性,可以看出我们学习的重点:

  • GC:要熟练掌握GC回收器的配置组合,理解G1的原理——这将成为性能调优的基本技能。
  • 熟悉JVMCI的接口,以便后续在某些高级场景下使用。
  • 了解分层编译的原理性知识,了解提前编译器原理和目标。

JVM-JEP

5.2.Issues

Java9在语言语法方面的其它小改进:

  • java.lang.ref:对强、软、弱、虚引用的处理进行了增强。
  • java.util.spi、javax.management、java.lang.instrument的修改。

从上述新特性,可以看出我们学习的重点:

  • 理解强、软、弱、虚引用的原理。

JVM-JDKx

6.下一步

通过上述解读,相信各位读者对Java9的新特性全景,应该有了一定的理解。

笔者将在后续文章中,详细剖析上述重点特性。