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 平台上动态链接的本地库,其子目录和文件不应由开发人员直接编辑或使用。
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
如果Optional有值,返回 Optional 指定的值,否则返回一个预设的值。
多分辨率图像 API
在 java.awt.image 包下新增了支持多分辨率图片的API,用于支持多分辨率的图片。
- 将不同分辨率的图像封装到一张(多分辨率的)图像中,作为它的变体。
- 获取这个图像的所有变体。
- 获取特定分辨率的图像变体,表示一张已知分辨率单位为 DPI 的特定尺寸大小的逻辑图像,并且这张图像是最佳的变体。
- java.awt.image.MultiResolutionImage接口的基础实现java.awt.image.BaseMultiResolutionImage获取所需要的变体。
- 通过接口的getResolutionVariant(double destImageWidth, double destImageHeight)方法,根据分辨率获取图像。