首页 > 潮·科技 > >
面试官问我Java9~14的有哪些重要的新特性,我哭了~~~( 四 )
2020-12-01
ZGC 堆由一组称为 ZPages 的堆区域组成 。 在 GC 周期中清空 ZPages 区域时 , 它们将被释放并返回到页面缓存 ZPageCache 中 , 此缓存中的 ZPages 按最近最少使用(LRU)的顺序 , 并按照大小进行组织 在 Java 13 中 , ZGC 将向操作系统返回被标识为长时间未使用的页面 , 这样它们将可以被其他进程重用 SocketAPI 重构
Java 13 为 Socket API 带来了新的底层实现方法 , 并且在 Java 13 中是默认使用新的 Socket 实现 , 使其易于发现并在排除问题同时增加可维护性 动态应用程序类-数据共享
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 总结关于预览特性
先贴一段 oracle 官网原文:This is a preview feature, which is a feature whose design, specification, and implementation are complete, but is not permanent, which means that the feature may exist in a different form or not at all in future JDK releases. To compile and run code that contains preview features, you must specify additional command-line options. 这是一个预览功能 , 该功能的设计 , 规格和实现是完整的 , 但不是永久性的 , 这意味着该功能可能以其他形式存在或在将来的 JDK 版本中根本不存在 。要编译和运行包含预览功能的代码 , 必须指定其他命令行选项 。 就以switch的增强为例子 , 从 Java12 中推出 , 到 Java13 中将继续增强 , 直到 Java14 才正式转正进入 JDK 可以放心使用 , 不用考虑后续 JDK 版本对其的改动或修改