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

动态应用程序类-数据共享

  • Java 13 中对 Java 10 中引入的 应用程序类数据共享进行了进一步的简化、改进和扩展 , 即:允许在 Java 应用程序执行结束时动态进行类归档 , 具体能够被归档的类包括:所有已被加载 , 但不属于默认基层 CDS 的应用程序类和引用类库中的类
Java14record 关键字
  • 简化数据类的定义方式 , 使用 record 代替 class 定义的类 , 只需要声明属性 , 就可以在获得属性的访问方法 , 以及 toString , hashCode,equals 方法
  • 类似于使用 Class 定义类 , 同时使用了 lomobok 插件 , 并打上了@Getter,@ToString,@EqualsAndHashCode注解
  • 作为预览特性引入 /** * 这个类具有两个特征 * 1. 所有成员属性都是final * 2. 全部方法由构造方法 , 和两个成员属性访问器组成(共三个) * 那么这种类就很适合使用record来声明 */ final class Rectangle implements Shape { final double length; final double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } double length() { return length; } double width() { return width; } } /** * 1. 使用record声明的类会自动拥有上面类中的三个方法 * 2. 在这基础上还附赠了equals() , hashCode()方法以及toString()方法 * 3. toString方法中包括所有成员属性的字符串表示形式及其名称 */ record Rectangle(float length, float width) { }
空指针异常精准提示
  • 通过 JVM 参数中添加-XX:+ShowCodeDetailsInExceptionMessages , 可以在空指针异常中获取更为详细的调用信息 , 更快的定位和解决问题 a.b.c.i = 99; // 假设这段代码会发生空指针 Exception in thread "main" java.lang.NullPointerException: Cannot read field 'c' because 'a.b' is null. at Prog.main(Prog.java:5) // 增加参数后提示的异常中很明确的告知了哪里为空导致
switch 的增强终于转正
  • JDK12 引入的 switch(预览特性)在 JDK14 变为正式版本 , 不需要增加参数来启用 , 直接在 JDK14 中就能使用
  • 主要是用->来替代以前的:+break;另外就是提供了 yield 来在 block 中返回值
Before Java 14
switch (day) {case MONDAY:case FRIDAY:case SUNDAY:System.out.println(6);break;case TUESDAY:System.out.println(7);break;case THURSDAY:case SATURDAY:System.out.println(8);break;case WEDNESDAY:System.out.println(9);break;}Java 14 enhancements
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);}instanceof 增强
  • instanceof 主要在类型强转前探测对象的具体类型 , 然后执行具体的强转
  • 新版的 instanceof 可以在判断的是否属于具体的类型同时完成转换
Object obj = "我是字符串";if(obj instanceof String str){System.out.println(str);}其他特性
  • 从 Java11 引入的 ZGC 作为继 G1 过后的下一代 GC 算法 , 从支持 Linux 平台到 Java14 开始支持 MacOS 和 Window(个人感觉是终于可以在日常开发工具中先体验下 ZGC 的效果了 , 虽然其实 G1 也够用)
  • 移除了 CMS 垃圾收集器(功成而退)
  • 新增了 jpackage 工具 , 标配将应用打成 jar 包外 , 还支持不同平台的特性包 , 比如 linux 下的deb和rpm , window 平台下的msi和exe
总结关于预览特性