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

  • 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中新增了静态方法 , 用于将流中的元素收集为不可变的集合
    Optional
    • 新增了orElseThrow()方法来在没有值时抛出异常
    并行全垃圾回收器 G1从 Java9 开始 G1 就了默认的垃圾回收器 , G1 是以一种低延时的垃圾回收器来设计的 , 旨在避免进行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收期在无法回收内存的时候触发 Full GC 。
    为了最大限度地减少 Full GC 造成的应用停顿的影响 , 从 Java10 开始 , G1 的 FullGC 改为并行的标记清除算法 , 同时会使用与年轻代回收和混合回收相同的并行工作线程数量 , 从而减少了 Full GC 的发生 , 以带来更好的性能提升、更大的吞吐量 。
    应用程序类数据共享在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing , 简称 CDS) , 允许将一组类预处理为共享归档文件 , 以便在运行时能够进行内存映射以减少 Java 程序的启动时间 , 当多个 Java 虚拟机(JVM)共享相同的归档文件时 , 还可以减少动态内存的占用量 , 同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用
    Java 10 在现有的 CDS 功能基础上再次拓展 , 以允许应用类放置在共享存档中 。 CDS 特性在原来的 bootstrap 类基础之上 , 扩展加入了应用类的 CDS (Application Class-Data Sharing) 支持 。 其原理为:在启动时记录加载类的过程 , 写入到文本文件中 , 再次启动时直接读取此启动文本并加载 。 设想如果应用环境没有大的变化 , 启动速度就会得到提升
    其他特性
    • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念 , 将允许在不运行全局 JVM 安全点的情况下实现线程回调 , 由线程本身或者 JVM 线程来执行 , 同时保持线程处于阻塞状态 , 这种方式使得停止单个线程变成可能 , 而不是只能启用或停止所有线程
    • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆 , 在可选内存设备上进行堆内存分配
    • 统一的垃圾回收接口:Java 10 中 , hotspot/gc 代码实现方面 , 引入一个干净的 GC 接口 , 改进不同 GC 源代码的隔离性 , 多个 GC 之间共享的实现细节代码应该存在于辅助类中 。 统一垃圾回收接口的主要原因是:让垃圾回收器(GC)这部分代码更加整洁 , 便于新人上手开发 , 便于后续排查相关问题 。
    Java11Java11 于 2018 年 9 月 25 日正式发布 , 这是很重要的一个版本!Java 11 和 2017 年 9 月份发布的 Java 9 以及 2018 年 3 月份发布的 Java 10 相比 , 其最大的区别就是:在长期支持(Long-Term-Support)方面 , Oracle 表示会对 Java 11 提供大力支持 , 这一支持将会持续至 2026 年 9 月 。 这是据 Java 8 以后支持的首个长期版本 。