语法变动

  1. 接口现在可以声明静态方法、private 方法。
  2. try with resource 现在括号内可以放外部声明的 Resource。

@Deprecated 注解变动

增加属性:String since。标识被弃用的代码从哪个版本开始弃用。
增加属性:boolean forRemoval。标识被弃用的代码是否会在未来的版本移除。

字符串底层改动

现在使用 byte[] 储存字符串数据(此前使用 char[])。初始化时,如果传入的字符全部可以用一个 byte 表示,则每个 byte 储存一个字符,并设置字符串内部的编码属性 coder = LATIN1。否则每 2 个 byte 储存一个字符(对于英文字符也用 2 个 byte),并设置 coder = UTF16。

模块化

模块化系统用于更好地组织代码并提高可维护性和安全性。

  • 通过模块化,可以对大型库进行裁切,实现最小化导入。
  • 更精细的访问控制。模块可以选择暴露哪些包、隐藏哪些包,增强了封装性。
  • 模块化使得单个功能模块的独立性更强,模块之间的依赖关系更清晰。

CompletableFuture 变动

  1. Java 9 的 CompletableFuture 对子类扩展的支持更加充分了。
  • newIncompleteFuture() 允许子类指定 CompletionStage 方法(thenApply、whenComplete、handle 等任务编排方法)要返回的新的未完成 CompletableFuture 实例为子类自己的实例,而非默认的 CompletableFuture 本身的实例。
  • defaultExecutor() 子类重载此方法即可指定用于异步任务的 Executor。默认的 ForkJoinPool 只适合执行 CPU 密集型任务,如果涉及到 IO,应该使用自定义的线程池,如 CachedThreadPool。
  1. 支持延时完成、超时等操作。相关方法:orTimeout、completeOnTimeout、completeAsync。

VarHandle

变量句柄(VarHandle)是对于一个变量或者是一组参数化定义的变量族,包括静态字段、非静态字段、数组元素等,的强类型引用。VarHandle 可以看作是 Unsafe 的安全封装,可以对变量执行包括普通 read/write 访问,volatile read/write 访问,以及 CAS 操作。

在 JDK9 引入了 VarHandle 之后,JUC包中对于变量的访问基本上都使用VarHandle,比如 AQS 中双向链表的节点中使用到的指针变量等。