Java 9 公布于 2017 年 9 月 21 日。作为 Java 8 之后 3 年半才公布的新版本,Java 9 带来了很多重大的变动其中最重要的改变是 Java 平台模块零碎的引入,其余还有诸如汇合、Stream 流 ……。
JEP 222: jshell-Java 命令行工具
JShell 是 Java 9 新增的一个实用工具。为 Java 提供了相似于 Python 的实时命令行交互工具。
在 JShell 中能够间接输出表达式并查看其执行后果。
JShell 为咱们带来了哪些益处呢?
升高了输入第一行 Java 版 ”Hello World!” 的门槛,可能进步老手的学习激情。
在解决简略的小逻辑,验证简略的小问题时,比 IDE 更有效率(并不是为了取代 IDE,对于简单逻辑的验证,IDE 更适合,两者互补)。
JShell 的代码和一般的可编译代码,有什么不一样?
一旦语句输出实现,JShell 立刻就能返回执行的后果,而不再须要编辑器、编译器、解释器。
JShell 反对变量的反复申明,前面申明的会笼罩后面申明的。
JShell 反对独立的表达式比方一般的加法运算 1 + 1。
JEP 261: 模块化零碎
什么是模块零碎?官网的定义是:
A uniquely named, reusable group of related packages, as well as resources (such as images and XML files) and a module descriptor。
简略来说,你能够将一个模块看作是一组惟一命名、可重用的包、资源和模块形容文件(module-info.java)。
把模块化开发实际引入到了 Java 平台中,能够让咱们的代码可重用性更好!
任意一个 jar 文件,只有加上一个模块形容文件(module-info.java),就能够降级为一个模块。
在引入了模块零碎之后,JDK 被从新组织成 94 个模块。Java 利用能够通过新增的 jlinkopen in new window 工具 (Jlink 是随 Java 9 一起公布的新命令行工具。它容许开发人员为基于模块的 Java 应用程序创立本人的轻量级、定制的 JRE),创立出只蕴含所依赖的 JDK 模块的自定义运行时镜像。这样能够极大的缩小 Java 运行时环境的大小。
咱们能够通过 exports 关键词精准管制哪些类能够对外开放应用,哪些类只能外部应用。
JEP 248:G1 成为默认垃圾回收器
在 Java 8 的时候,默认垃圾回收器是 Parallel Scavenge(新生代)+Parallel Old(老年代)。到了 Java 9, CMS 垃圾回收器被废除了,G1(Garbage-First Garbage Collector)成为了默认垃圾回收器。
G1 还是在 Java 7 中被引入的,通过两个版本优异的体现成为成为默认垃圾回收器。
JEP 193: 变量句柄
变量句柄是一个变量或一组变量的援用,包含动态域,非动态域,数组元素和堆外数据结构中的组成部分等。
变量句柄的含意相似于已有的办法句柄 MethodHandle,由 Java 类 java.lang.invoke.VarHandle 来示意,能够应用类 java.lang.invoke.MethodHandles.Lookup 中的动态工厂办法来创立 VarHandle 对象。
VarHandle 的呈现代替了 java.util.concurrent.atomic 和 sun.misc.Unsafe 的局部操作。并且提供了一系列规范的内存屏障操作,用于更加细粒度的管制内存排序。在安全性、可用性、性能上都要优于现有的 API。
JEP 110: HTTP 2 Client
JEP 143: 优化竞争锁的性能
JEP 197: 分段代码缓存
JEP 199: 智能 java 编译工具
200: The Modular JDK
201: Modular Source Code
JEP 254:字符串存储构造优化
Java 8 及之前的版本,String 始终是用 char[]
存储。在 Java 9 之后,String 的实现改用 byte[]
数组存储字符串,节俭了空间。
接口公有办法
Java 9 容许在接口中应用公有办法。这样的话,接口的应用就更加灵便了,有点像是一个简化版的抽象类。
try-with-resources 加强
在 Java 9 之前,咱们只能在 try-with-resources 块中申明变量:
在 Java 9 之后,在 try-with-resources 语句中能够应用 effectively-final 变量。
final Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))
try (scanner;writer) {// omitted}
什么是 effectively-final 变量?
简略来说就是没有被 final 润饰然而值在初始化后从未更改的变量。正如下面的代码所演示的那样,即便 writer 变量没有被显示申明为 final,但它在第一次被复制后就不会扭转了,因而,它就是 effectively-final 变量。
Stream & Optional 加强
Stream 中减少了新的办法 ofNullable()、dropWhile()、takeWhile() 以及 iterate() 办法的重载办法。
Java 9 中的 ofNullable() 方 法容许咱们创立一个单元素的 Stream,能够蕴含一个非空元素,也能够创立一个空 Stream。而在 Java 8 中则不能够创立空的 Stream。
过程 API
Java 9 减少了 java.lang.ProcessHandle 接口来实现对原生过程进行治理,尤其适宜于治理长时间运行的过程。
// 获取以后正在运行的 JVM 的过程
ProcessHandle currentProcess = ProcessHandle.current();
// 输入过程的 id
System.out.println(currentProcess.pid());
// 输入过程的信息
System.out.println(currentProcess.info());
响应式流(Reactive Streams)
在 Java 9 中的 java.util.concurrent.Flow 类中新增了反应式流标准的外围接口。
Flow 中蕴含了 Flow.Publisher、Flow.Subscriber、Flow.Subscription 和 Flow.Processor 等 4 个外围接口。Java 9 还提供了 SubmissionPublisher 作为 Flow.Publisher 的一个实现。
疾速创立不可变汇合
减少了 List.of()、Set.of()、Map.of() 和 Map.ofEntries() 等工厂办法来创立不可变汇合(有点参考 Guava 的滋味):
List.of("Java", "C++");
Set.of("Java", "C++");
Map.of("Java", 1, "C++", 2);
应用 of() 创立的汇合为不可变汇合,不能进行增加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异样。