文章目录
- 1、基于时间的版本号
- 2、局部类型推断
- 3、基于 Java 的 JIT 编译器(实验性)
- 4、类数据共享
- 5、G1 并行全 GC
- 6、Unicode 语言标签扩展
- 7、API 更新
- 8、其他更新
Java 10 新特性
自从 Java 9
开始,Oracle 调整了 Java 版本的发布策略,不再是之前的 N 年一个大版本,取而代之的是 6 个月一个小版本,三年一个大版本,这样可以让 Java 的最新改变迅速上线,而小版本的维护周期缩短到下个版本发布之前,大版本的维护周期则是 3 年之久。而 10 就是这么一个小版本,因为 Java 的后续版本基本都会包含之前新特性,所以还是把 Java 10
带来的改变单独写一写(不全)。
Java 10 全部的新特性,请看官网:JDK 10 发行说明
Java各个版本的文档入口:Java平台,标准版文档
Java各个版本下载:https://jdk.java.net/archive/
1、基于时间的版本号
就像上面说的,Java 调整了发布策略,为了适应这种发布节奏,随着改变的还有 Java 版本号的记录方式。
版本号的新模式是:$FEATURE.$INTERIM.$UPDATE.$PATCH
-
$FEATURE
:基于发布版本,如 Java 10 的 10 。 -
$INTERIM
:问题修复和功能增强时 + 1,默认是 0 。 -
$UPDATE
:在进行兼容更新,修复新功能安全问题时 +1。 -
$PATCH
:特殊问题修复时 +1。
查看自己的 Java 10
版本。
2、局部类型推断
JEP 286 提案让 Java 增加了局部类型推断(Local-Variable Type Inference)功能,这让 Java 可以像 Js
里的 var
或者其他语言的 auto
一样可以自动推断数据类型。这其实只是一个新的语法糖,底层并没有变化,在编译时就已经把 var
转化成具体的数据类型了,但是这样可以减少代码的编写。
你可以像下面这样使用 var
语法。
如果你反编译编译后的这段代码,你会发现还是熟悉的代码片段。
var
看似好用,其实也有很多限制,官方介绍了 var
只能用于下面的几种情况。
- 仅限带有初始化的程序的局部变量。
-
for
循环或者增强for
循环中。 -
for
循环中的声明。
下面演示三种使用情况。
尽管对 var
的使用场景增加了很多限制,但在实际使用时你还是要注意,就像下面的代码,你可能一眼并不能看出 result
的数据类型。
3、基于 Java 的 JIT 编译器(实验性)
这个功能让基于 Java 开发的 JIT 编译器 Graal
结合 Java 10
用在 Linux /x64 平台上,这是一个实验性的 JIT 编译器,有人说这也是 Java 10
中最具有未来感的引入。Graal 其实在 Java 9
中就已经引入了,它带来了 Java 中的 AOT (Ahead Of Time)编译,还支持多种语言,如 Js、Python、Ruby、R、以及其他基于 JVM (如 Java、Kotlin)的和基于 LLVM (如 C、C++)的语言。
想切换到 Graal
可以使用下面的 jvm
参数。
这里面有一点我觉得很有意思,看这个图。
这就很有意思了,Graal
是 Java 语言编写的,用 Java 编写的编译器,然后用来将 Java 字节码编译机器代码。
Graal
官网:https://www.graalvm.org/(opens new window)
4、类数据共享
JVM 启动时有一步是需要在内存中加载类,而如果有多个 jar,加载第一个 jar 的速度是最慢的。这就延长了程序的启动时间,为了减少这个时间,Java 10
引入了应用程序类数据共享(CDS)机制,它可以把你想共享的类共享在程序之间,使不同的 Java 进程之间共享这个类来减少这个类占用的空间以及加载速度。
5、G1 并行全 GC
早在 Java 9
时就已经引入了 G1 垃圾收集器,G1 的优点很多。而在 Java 10
中还是做了小小调整,当 G1 的并发收集线程不能快速的完成全 GC 时,就会自动切换到并行收集,这可以减少在最坏情况下的 GC 速度。
6、Unicode 语言标签扩展
这个提案让 JDK 实现了最新的 LDML 规范 (opens new window)中指定的更多的扩展。
主要增加了下面几个扩展方法。
尝试一下。
输出结果。
7、API 更新
Java 10
删除了部分 API,也增加了一些实用方法。比如可以通过 Collection.copyOf
复制得到一个不可改变集合,即使原来的集合元素发生了变化也不会有影响。
也为 Optional
增加了一个新的方法 orElseThrow
。调用这个方法也可以获取到 optional
中的 value
, 但是如果 value
为 null
,就会抛出异常。
另外在 Stream
最后收集数据的时候,Collectors
可以直接指定收集的集合为不可变集合,像下面这样。
8、其他更新
Java 10
的更新内容不止这些,上面只是列举了常用的以及比较有意思的新特性。还有部分更新如:
- JEP 312:Thread-Local Handshakes,JVM 内部功能,可以提高 JVM 性能。
- JEP 313:删除了
javah
工具,说是删除,其实功能已经包含在Java 8
中的javac
里。 - JEP 316:让 JVM 可以在备用的存储设备(如 NV-DIMM)上分配堆内存,而不用更改程序代码。
- JEP 319:在 JDK 中提供一组默认的根证书颁发机构(CA)证书。
Java 10 全部的新特性,请看官网:JDK 10 发行说明