Java 9 新特性

Java 9 概述

jdk 9 在 2017 年 9 月 21 日发布。

国内下载地址

java 9 提供了超过 150 项新功能特性,包括备受期待的模块化系统、 可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有 代码,以及安全增强、扩展提升、性能管理改善等。可以说 Java 9 是 一个庞大的系统工程,完全做了一个整体改变。

具体来讲:

  • 模块化系统
  • jShell 命令
  • 多版本兼容 jar 包
  • 接口的私有方法
  • 钻石操作符的使用升级
  • 语法改进:try 语句
  • 下划线使用限制
  • String 存储结构变更
  • 便利的集合特性:of()
  • 增强的 Stream API
  • 多分辨率图像 API
  • 全新的 HTTP 客户端 API
  • Deprecated 的相关 API
  • 智能 Java 编译工具
  • 统一的 JVM 日志系统
  • javadoc 的 HTML 5 支持
  • Javascript 引擎升级:Nashorn
  • java 的动态编译器

在线 Oracle JDK 9 Documentation https://docs.oracle.com/javase/9/
官方提供的新特性列表: <https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23 AFD78-C777-460B-8ACE-58BE5EA681F6> 或参考 Open JDK http://openjdk.java.net/projects/jdk9/

JEP(JDK Enhancement Proposals):jdk 改进提案,每当需要有新的 设想时候,JEP 可以在 JCP(java community Process)之前或者同时提 出非正式的规范(specification),被正式认可的 JEP 正式写进 JDK 的 发展路线图并分配版本号。

JSR(Java Specification Requests):java 规范提案,新特性的规范出 现在这一阶段,是指向 JCP(Java Community Process)提出新增一个 标准化技术规范的正式请求。请求可以来自于小组/项目、JEP、JCP 成员或者 java 社区(community)成员的提案,每个 java 版本都由相 应的 JSR 支持。

JDK 9 的目录结构

没有名为 jre 的子目录

  • bin目录: 包含所有命令。 在 Windows 平台上,它继续包含系统的运行时动态链接库。
  • conf目录: 包含用户可编辑的配置文件,例如以前位于 jre\lib 目录中的.properties 和.policy 文件
  • include 目录: 包含要在以前编译本地代码时使用的 C/C++头文件。它只存在于 JDK 中
  • jmods 目录: 包含 JMOD 格式的平台模块。 创建自定义运行时映像时需要它。 它只存在于 JDK 中
  • legal 目录: 包含法律声明
  • lib 目录: 包含非 Windows 平台上的动态链接本地库。 其子目录和文件不应由开发人员直接编辑或使用

模块化系统: Jigsaw Modularity

  • 设计理念: 模块独立、化繁为简 模块化(以 Java 平台模块系统的形式)将 JDK 分成一组模块,可 以在编译时,运行时或者构建时进行组合。
  • 实现目标
    • 主要目的在于减少内存的开销
    • 只须必要模块,而非全部jdk模块,可简化各种类库和大型应用的 开发和维护
    • 改进 Java SE 平台,使其可以适应不同大小的计算设备
    • 改进其安全性,可维护性,提高性能
  • 示例

Java 的 REPL 工具: jShell 命令

http://openjdk.java.net/jeps/222

产生背景

像 Python 和 Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print - loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。而之前的 Java 版本要想执行代码,必须创建文件、声明类、提供测试方法方可实现。

设计理念

即写即得、快速运行

实现目标

  • Java 9 中终于拥有了 REPL 工具:jShell。利用 jShell 在没有创建类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行java 的代码,而无需创建 Java 文件,无需跟人解释”public static void main(String[] args)”这句废话。
  • jShell 也可以从文件中加载语句或者将语句保存到文件中。
  • jShell 也可以是 tab 键进行自动补全和自动添加分号。

使用示例

jar包中兼容多版本的类

http://openjdk.java.net/jeps/238

语法改进:接口的私有方法

http://openjdk.java.net/jeps/213

语法改进:钻石操作符(Diamond Operator)使用升级

语法改进:try 语句

语法改进:UnderScore(下划线)使用的限制

String 存储结构变更

JEP 254: Compact Strings http://openjdk.java.net/jeps/254

10. 集合工厂方法:快速创建只读集合

269: Convenience Factory Methods for Collections http://openjdk.java.net/jeps/269

增强的 Stream API

在 Java 9 中,Stream API 变得更好,Stream 接口中添加了 4 个 新的方法:dropWhile, takeWhile, ofNullable,还有个 iterate 方法的 新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时 候结束迭代。(见下例)

多分辨率图像 API

全新的 HTTP 客户端 API

http://openjdk.java.net/jeps/110

http版本发展及历史

直到 2015 年,HTTP2 才成为标准。

HTTP/1.1 和 HTTP/2 的主要区别是如何在客户端和服务器之间构建 和传输数据。HTTP/1.1 依赖于请求/响应周期。 HTTP/2 允许服务器 “push”数据:它可以发送比客户端请求更多的数据。 这使得它可 以优先处理并发送对于首先加载网页至关重要的数据。

  1. Deprecated 的相关 API

  2. 智能 Java 编译工具

  1. 统一的 JVM 日志系统
  1. javadoc 的 HTML 5 支持

  2. Javascript 引擎升级:Nashorn

  1. java 的动态编译器
作者:张三  创建时间:2022-04-19 16:07
最后编辑:张三  更新时间:2022-06-29 15:20