1.JShell工具

  • JShell 是 Java 9 新增的一个交互式的编程环境工具,允许无需使用类或者方法包来执行 Java 语句,可以直接输入表达式并查看其执行结果。

使用JShell,您可以一次输入一个程序元素,立即查看结果,并根据需要进行调整。
Java程序开发通常涉及以下过程:

  • 编写一个完整的程序。
  • 编译并修复所有错误。
  • 运行程序。
  • 找出问题所在。
  • 编辑它。
  • 重复该过程。

JShell可帮助您试用代码并在开发程序时轻松探索选项。您可以测试单个语句,尝试方法的不同变体,并在JShell会话中尝试使用不熟悉的API。JShell不会替代IDE。在开发程序时,将代码粘贴到JShell中进行尝试,然后将工作代码从JShell粘贴到程序编辑器或IDE中。

2.增强了Stream API(在java8基础上,新增加4个方法)

  • List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例, 以更简洁的方式来创建集合。新方法添加到 List,Set 和 Map 接口以及它们的重载对象

JDK9在Stream接口中新增4个方法:dropWhile、takeWhile、ofNullable,为iterate方法新增重载方法。

takeWhile

takeWhile可以用于从 Stream 中获取一部分数据,接受一个 Predicate 来进行选择,在有序的 Stream 中,takeWhile 返回从头开始的尽可能多的元素。

dropWhile

dropWhile 的方法刚好与 takeWhile想法,返回剩余的元素。

ofNullable

在JDK8 中 Stream 不能完全为null,否则会报空指针异常。而在JDK9 中 ofNullable 方法允许创建一个为空的 Stream。
iterate() 重载方法
//JDK8 使用iterate方法,需配合limit截止。
Stream.iterate(1, (x) -> x + 1).limit(10).forEach(System.out::print);
System.out.println();
//JDK9 使用iterate的重载方法可以直接使用Predicate来截止。
Stream.iterate(1,(x) -> x <= 10, (x) -> x + 1).forEach(System.out::print);

3.接口Interface的升级

  • 为了避免冗余代码和更多的可重用性,JDK9引入JavaSE9接口中的私有方法,也可以使用private关键字在接口interface中编写私有和私有静态方法。

    4.模块化

  • 某一个模块运行的时候,jvm只会启动和它有依赖的模块,并不会加载所有的模块到内存中,这样性能大大的提高了。

module-info.java:该文件必须位于项目的根目录中。该文件用于定义模块需要什么依赖,以及那些包被外部使用。
exports:控制着那些包可以被其他模块访问到,所有不被exports的包默认都被封装在模块里面不被外界所使用。
requires:指明对其他模块的依赖。

5.Process API Improvements

  • Process API 添加了一个名为 ProcessHandle 的接口来增强 java.lang.Process 类。
  • ProcessHandle 接口的实例标识一个本地进程,它允许查询进程状态并管理进程。
  • ProcessHandle 嵌套接口 Info 来让开发者逃离时常因为要获取一个本地进程的 PID 而不得不使用本地代码的窘境。

    6.异常处理try升级

  • 如果已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量

JDK8中新增了try-with-resources语句,可以自动关闭需要关闭的资源文件。但是必须在try语句后的括号中初始化需要关闭的资源。在JDK9中改进了try-with-resources语句,你可以在try外初始化资源,然后在try后的括号中添加需要自动关的资源即可。

7.钻石操作符<>升级

  • 可以与匿名的内部类一起使用,从而提高代码的可读性

JDK9中钻石操作符可以使用匿名实现类,可以在匿名实现类中重写方法等操作。

8.特殊标识符增加限制

  • java8 之前 String _ =”hello”; 这样的标识符可以用,java9就不可以

    9.String底层存储结构更换

  • java8之前 String的底层结构类型都是 char[] char数组存储数据private final char value[]

  • ,但是java9 就替换成 byte[] 这样来讲,更节省了空间和提高了性能 存储数据改为byte数组存储数据private final byte[] value。

    10.引进HttpClient

  • 以往我们都是通过maven添加httpclient ,java9直接引入即可

    11.目录结构发生变化

    JDK9具体目录结构如下所示:

  • bin: 该目录包含所有的命令。

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

注:JDK9 目录中不再有jre子目录。

12.多版本兼容Jar包

当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本(许多情况下就是 Java 6 或者 Java7)。这实际上意味着未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 jar 功能能让你创建仅在特定版本的 Java 环境中运行库程序选择使用的 class 版本。

改进 Optional 类

Optional 类是在JDK8中新增的类,主要是为了解决空指针异常。在JDK9中对这个类进行了改进,主要是新增了三个方法:stream,ifPresentOrElse 和 or 。

stream

stream方法将Optional转为一个 Stream,如果Optional 没有值就返回一个 Stream.empty。

ifPresentOrElse

ifPresentOrElse方法:
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
如果 Optional 包含值,则对其包含的值调用函数 action,即 action.accept(value),这与 ifPresent 一致;与 ifPresent 方法的区别在于,ifPresentOrElse 还有第二个参数 emptyAction。如果 Optional 不包含值,那么 ifPresentOrElse 便会调用 emptyAction,即 emptyAction.run()。

or

or方法:
public Optional or(Supplier<? extends Optional<? extends T>> supplier)
如果Optional有值,返回 Optional 指定的值,否则返回一个预设的值。

多分辨率图像 API

在 java.awt.image 包下新增了支持多分辨率图片的API,用于支持多分辨率的图片。

  1. 将不同分辨率的图像封装到一张(多分辨率的)图像中,作为它的变体。
  2. 获取这个图像的所有变体。
  3. 获取特定分辨率的图像变体,表示一张已知分辨率单位为 DPI 的特定尺寸大小的逻辑图像,并且这张图像是最佳的变体。
  4. java.awt.image.MultiResolutionImage接口的基础实现java.awt.image.BaseMultiResolutionImage获取所需要的变体。
  5. 通过接口的getResolutionVariant(double destImageWidth, double destImageHeight)方法,根据分辨率获取图像。

全新的 HTTP 客服端 API

智能 JAVA 编译工具

统一的 JVM 日志系统

javadoc 的 HTML5 支持

java 动态编译器