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的成败。
显然,不是所有的跳票,都不能留给人悬念。
笔者在《【Java新特性】-0-学习Java新特性,如何快人一步》中分享了一种快速学习Java新特性的方法,本文将采用这种方法,对于Java9新特性的全貌进行解读。
1.Java9新特性全貌
Java9的新特性覆盖了四个方面:
语言语法
核心类库
扩展类库
JVM
2.语言语法
2.1.JEP
JEP涉及的改进包括:
- 声明与初始化:下划线”_",不再是合法字符。
- 数据类型:字符串的内部存储结构发生了变化,用于减少存储空间。
- 面向对象:接口支持了私有方法。
- 异常:try-with-resources中,支持在try之前定义try()中的资源相关的变量。
- 代码组织方式:增加了模块化——这也是Java9最大的新特性,也是饱受争议的新特性。
从上述新特性,可以看出我们学习的重点:
- Java依托Coin项目,持续地对基础语法进行小改进,我们及时了解这些改进,有助于提升我们实战中的编码效率。
- Java克服重重阻力,重点推出了模块化。如何熟练使用模块化、如何平滑迁移现有软件产品都是我们的重点研究方向。
说明:Coin项目是Java团队针对Java语言语法的改进专项,其中吸收了不少从其它现代编程语言中吸收的有趣语法特性,即使这些改进不一定都会在Java中落地,了解它们也能看到在现代编程语言中的广受欢迎的语法特性、语言设计思想。
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的改动。
3.核心类库
3.1.JEP
JEP涉及的改进包括:
- 集合与泛型:新增了of方法,便于简化创建集合的代码。
- 多线程编程:主要针对API底层实现的修改,用来提升线程相关性能,如:提升存在竞争的对象锁的性能,如:自旋循环提示。
- 反射:增加了MethodHandle。
从上述新特性,可以看出我们学习的重点:
- 重点学习集合与泛型新增的API,有助于提升开发效率。
- 了解MethodHandle相关API,有助于编写更有技巧性的代码。
3.2. Issues
Java9在核心类库的其它小改进:
- 集合与泛型:Collections包有少量优化,新增了一些Stream的API——重点。
- 多线程编程:优化了java.util.concurrent。
- 反射:优化了java.lang.invoke。
从上述新特性,可以看出我们学习的重点:
- 熟练StreamAPI的优化,提升开发效率。
- 熟悉juc包的变化,增强并发编程能力。
4.扩展类库
4.1.JEP
JEP涉及的改进包括:
IO编程:增强了ProcessAPI
网络编程:提供新的HttpClient接口
安全类库:增强了加密算法/密钥等
其它类库:如:Nashorn引入和增强,废弃Applet/增强JavaFx,日志库增强等
从上述新特性,可以看出我们学习的重点:
- 熟悉新的ProcessAPI、HttpClient,思考实战中使用场景。
说明:对于进程相关的库,没有找到更合适的归类方法,暂时放在IO编程分类了。
4.2.Issues
Java9在扩展类库的其它小改进:
- 修改了IO & NIO对应的API及其底层实现,用来提升性能和健壮性——这是学习的重点。
- XML相关API的内部实现升级。
从上述新特性,可以看出我们学习的重点:
- 熟悉IO & NIO新的API,以便提升IO编程相关性能。
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的接口,以便后续在某些高级场景下使用。
- 了解分层编译的原理性知识,了解提前编译器原理和目标。
5.2.Issues
Java9在语言语法方面的其它小改进:
- java.lang.ref:对强、软、弱、虚引用的处理进行了增强。
- java.util.spi、javax.management、java.lang.instrument的修改。
从上述新特性,可以看出我们学习的重点:
- 理解强、软、弱、虚引用的原理。
6.下一步
通过上述解读,相信各位读者对Java9的新特性全景,应该有了一定的理解。
笔者将在后续文章中,详细剖析上述重点特性。