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

简化启动单个源代码文件的方法

  • 增强了 Java 启动器 , 使其能够运行单一文件的 Java 源代码 。 此功能允许使用 Java 解释器直接执行 Java 源代码 。 源代码在内存中编译 , 然后由解释器执行 。 唯一的约束在于所有相关的类必须定义在同一个 Java 文件中
  • 对于 Java 初学者并希望尝试简单程序的人特别有用 , 并且能和 jshell 一起使用
  • 一定能程度上增强了使用 Java 来写脚本程序的能力
用于 Lambda 参数的局部变量语法
  • 从 Java 10 开始 , 便引入了局部变量类型推断这一关键特性 。 类型推断允许使用关键字 var 作为局部变量的类型而不是实际类型 , 编译器根据分配给变量的值推断出类型
  • Java 10 中对 var 关键字存在几个限制 只能用于局部变量上 声明时必须初始化 不能用作方法参数 不能在 Lambda 表达式中使用
  • Java11 开始允许开发者在 Lambda 表达式中使用 var 进行参数声明
其他特性
  • 新的垃圾回收器 Epsilon , 一个完全消极的 GC 实现 , 分配有限的内存资源 , 最大限度的降低内存占用和内存吞吐延迟时间
  • 低开销的 Heap Profiling:Java 11 中提供一种低开销的 Java 堆分配采样方法 , 能够得到堆分配的 Java 对象信息 , 并且能够通过 JVMTI 访问堆信息
  • TLS1.3 协议:Java 11 中包含了传输层安全性(TLS)1.3 规范(RFC 8446)的实现 , 替换了之前版本中包含的 TLS , 包括 TLS 1.2 , 同时还改进了其他 TLS 功能 , 例如 OCSP 装订扩展(RFC 6066 , RFC 6961) , 以及会话散列和扩展主密钥扩展(RFC 7627) , 在安全性和性能方面也做了很多提升
  • 飞行记录器:飞行记录器之前是商业版 JDK 的一项分析工具 , 但在 Java 11 中 , 其代码被包含到公开代码库中 , 这样所有人都能使用该功能了
Java12增强 Switch
  • 传统的 switch 语法存在容易漏写 break 的问题 , 而且从代码整洁性层面来看 , 多个 break 本质也是一种重复
  • Java12 提供了 swtich 表达式 , 使用类似 lambda 语法条件匹配成功后的执行块 , 不需要多写 break
  • 作为预览特性加入 , 需要在javac编译和java运行时增加参数--enable-preview switch (day) { case MONDAY, FRIDAY, SUNDAY -> System.out.println(6); case TUESDAY -> System.out.println(7); case THURSDAY, SATURDAY -> System.out.println(8); case WEDNESDAY -> System.out.println(9); }
数字格式化工具类
  • NumberFormat 新增了对复杂的数字进行格式化的支持 NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); String result = fmt.format(1000); System.out.println(result); // 输出为 1K , 计算工资是多少K更方便了 。。。
Shenandoah GC
  • Redhat 主导开发的 Pauseless GC 实现 , 主要目标是 99.9% 的暂停小于 10ms , 暂停与堆大小无关等
  • 和 Java11 开源的 ZGC 相比(需要升级到 JDK11 才能使用) , Shenandoah GC 有稳定的 JDK8u 版本 , 在 Java8 占据主要市场份额的今天有更大的可落地性
G1 收集器提升
  • Java12 为默认的垃圾收集器 G1 带来了两项更新: 可中止的混合收集集合:JEP344 的实现 , 为了达到用户提供的停顿时间目标 , JEP 344 通过把要被回收的区域集(混合收集集合)拆分为强制和可选部分 , 使 G1 垃圾回收器能中止垃圾回收过程 。G1 可以中止可选部分的回收以达到停顿时间目标 及时返回未使用的已分配内存:JEP346 的实现 , 增强 G1 GC , 以便在空闲时自动将 Java 堆内存返回给操作系统
Java13引入 yield 关键字到 Switch 中
  • Switch 表达式中就多了一个关键字用于跳出 Switch 块的关键字 yield , 主要用于返回一个值
  • yield和 return 的区别在于:return 会直接跳出当前循环或者方法 , 而 yield 只会跳出当前 Switch 块 , 同时在使用 yield 时 , 需要有 default 条件 private static String descLanguage(String name) { return switch (name) { case "Java": yield "object-oriented, platform independent and secured"; case "Ruby": yield "a programmer's best friend"; default: yield name +" is a good language"; }; }
文本块
  • 解决 Java 定义多行字符串时只能通过换行转义或者换行连接符来变通支持的问题 , 引入三重双引号来定义多行文本
  • 两个"""中间的任何内容都会被解释为字符串的一部分 , 包括换行符 String json ="{\n" + " \"name\":\"mkyong\",\n" + " \"age\":38\n" + "}\n"; // 未支持文本块之前 String json = """ { "name":"mkyong", "age":38 } """;
增强 ZGC 释放未使用内存