面试官问我Java9~14的有哪些重要的新特性,我哭了~~~

大家好 , 我是Guide哥!这篇文章来自读者的投稿 , 经过了两次较大的改动 , 两周的完善终于完成 。
Guide 哥:别人家的特性都用了几年了 , 我 Java 才出来 , 哈哈!真实!
Java9发布于 2017 年 9 月 21 日。 作为 Java8 之后 3 年半才发布的新版本 , Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块系统的引入,其他还有诸如集合、Stream 流
Java 平台模块系统Java 平台模块系统 , 也就是 Project Jigsaw , 把模块化开发实践引入到了 Java 平台中 。 在引入了模块系统之后 , JDK 被重新组织成 94 个模块 。 Java 应用可以通过新增的 jlink 工具 , 创建出只包含所依赖的 JDK 模块的自定义运行时镜像 。 这样可以极大的减少 Java 运行时环境的大小 。
Java 9 模块的重要特征是在其工件(artifact)的根目录中包含了一个描述模块的 module-info.class 文 件 。工件的格式可以是传统的 JAR 文件或是 Java 9 新增的 JMOD 文件 。
Jshelljshell 是 Java 9 新增的一个实用工具 。 为 Java 提供了类似于 Python 的实时命令行交互工具 。
在 Jshell 中可以直接输入表达式并查看其执行结果
集合、Stream 和 Optional

  • 增加 了 List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合 , 比如List.of("Java", "C++");、Map.of("Java", 1, "C++", 2);(这部分内容有点参考 Guava 的味道)
  • Stream 中增加了新的方法 ofNullable、dropWhile、takeWhile 和 iterate 方法 。 Collectors 中增加了新的方法 filtering 和 flatMapping
  • Optional 类中新增了 ifPresentOrElse、or 和 stream 等方法
进程 APIJava 9 增加了 ProcessHandle 接口 , 可以对原生进程进行管理 , 尤其适合于管理长时间运行的进程
平台日志 API 和服务【面试官问我Java9~14的有哪些重要的新特性,我哭了~~~】Java 9 允许为 JDK 和应用配置同样的日志实现 。 新增了 System.LoggerFinder 用来管理 JDK 使 用的日志记录器实现 。 JVM 在运行时只有一个系统范围的 LoggerFinder 实例 。
我们可以通过添加自己的 System.LoggerFinder 实现来让 JDK 和应用使用 SLF4J 等其他日志记录框架 。
反应式流 ( Reactive Streams )
  • 在 Java9 中的 java.util.concurrent.Flow 类中新增了反应式流规范的核心接口
  • Flow 中包含了 Flow.Publisher、Flow.Subscriber、Flow.Subscription 和 Flow.Processor 等 4 个核心接口 。 Java 9 还提供了SubmissionPublisher 作为Flow.Publisher 的一个实现 。
变量句柄
  • 变量句柄是一个变量或一组变量的引用 , 包括静态域 , 非静态域 , 数组元素和堆外数据结构中的组成部分等
  • 变量句柄的含义类似于已有的方法句柄MethodHandle
  • 由 Java 类java.lang.invoke.varHandle 来表示 , 可以使用类 java.lang.invoke.MethodHandles.Lookup 中的静态工厂方法来创建 VarHandle 对 象
改进方法句柄(Method Handle)
  • 方法句柄从 Java7 开始引入 , Java9 在类java.lang.invoke.MethodHandles 中新增了更多的静态方法来创建不同类型的方法句柄
其它新特性
  • 接口私有方法 :Java 9 允许在接口中使用私有方法
  • try-with-resources 增强 :在 try-with-resources 语句中可以使用 effectively-final 变量(什么是 effectively-final 变量 , 见这篇文章 )
  • 类 CompletableFuture 中增加了几个新的方法(completeAsync, orTimeout 等)
  • Nashorn 引擎的增强 :Nashorn 从 Java8 开始引入的 JavaScript 引擎 , Java9 对 Nashorn 做了些增强 , 实现了一些 ES6 的新特性
  • I/O 流的新特性 :增加了新的方法来读取和复制 InputStream 中包含的数据
  • 改进应用的安全性能 :Java 9 新增了 4 个 SHA- 3 哈希算法 , SHA3-224、SHA3-256、SHA3-384 和 S HA3-512
  • ......
Java10发布于 2018 年 3 月 20 日 , 最知名的特性应该是 var 关键字(局部变量类型推断)的引入了 , 其他还有垃圾收集器改善、GC 改进、性能提升、线程管控等一批新特性
var 关键字
  • 介绍 :提供了 var 关键字声明局部变量:var list = new ArrayList(); // ArrayList
  • 局限性 :只能用于带有构造器的局部变量和 for 循环中
Guide 哥:实际上 Lombok 早就体用了一个类似的关键字 , 使用它可以简化代码 , 但是可能会降低程序的易读性、可维护性 。 一般情况下 , 我个人都不太推荐使用 。
不可变集合list , set , map 提供了静态方法copyOf()返回入参集合的一个不可变拷贝(以下为 JDK 的源码)
static List copyOf(Collection coll) {return ImmutableCollections.listCopy(coll);}java.util.stream.Collectors中新增了静态方法 , 用于将流中的元素收集为不可变的集合