Java 9 新特性
Java 9 概述
jdk 9 在 2017 年 9 月 21 日发布。
国内下载地址
- windows https://mirrors.huaweicloud.com/openjdk/9.0.4/openjdk-9.0.4_windows-x64_bin.tar.gz
- linux https://mirrors.huaweicloud.com/openjdk/9.0.4/openjdk-9.0.4_linux-x64_bin.tar.gz
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”数据:它可以发送比客户端请求更多的数据。 这使得它可 以优先处理并发送对于首先加载网页至关重要的数据。
Deprecated 的相关 API
智能 Java 编译工具
- 统一的 JVM 日志系统
javadoc 的 HTML 5 支持
Javascript 引擎升级:Nashorn
- java 的动态编译器
最后编辑:张三 更新时间:2022-06-29 15:20