• Java 版本任你发,我用Java8.(Java 15 新功能介绍 )


    Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的。

    Java 15 官方下载:Archived OpenJDK GA Releases

    Java 15 官方文档:JDK 15

    Java 15 新功能:

    JEP 378文本块

    1. JEP 339 爱德华曲线算法(EdDSA)

    Java 15 中增加了一个新的密码学算法,爱德华曲线算法(EdDSA)签名算法。它是由 Schnorr 算法发展而来,在 RFC8032 中被定义实现。

    1. package com.wuliyouguocheng;
    2. import java.nio.charset.StandardCharsets;
    3. import java.security.InvalidKeyException;
    4. import java.security.KeyPair;
    5. import java.security.KeyPairGenerator;
    6. import java.security.NoSuchAlgorithmException;
    7. import java.security.Signature;
    8. import java.security.SignatureException;
    9. import java.util.Base64;
    10. public class JEP339 {
    11. public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    12. KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
    13. KeyPair kp = kpg.generateKeyPair();
    14. byte[] msg = "wuliyouguocheng".getBytes(StandardCharsets.UTF_8);
    15. Signature sig = Signature.getInstance("Ed25519");
    16. sig.initSign(kp.getPrivate());
    17. sig.update(msg);
    18. byte[] s = sig.sign();
    19. System.out.println(Base64.getEncoder().encodeToString(s));
    20. }
    21. }

    输出结果:

    VXlpxapU+LSWjVQ0QNJvdpUh6VI6PjSwOQ2pHu65bCfnLR13OyWKunlc9rc+7SMxCh2Mnqf7TmC/iOG8oimbAw==
    

    2. JEP 360:Sealed Classes(密封类)预览

    我们都知道,在 Java 中如果想让一个类不能被继承和修改,这时我们应该使用 final 关键字对类进行修饰。不过这种要么可以继承,要么不能继承的机制不够灵活,有些时候我们可能想让某个类可以被某些类型继承,但是又不能随意继承,是做不到的。Java 15 尝试解决这个问题,引入了 sealed 类,被 sealed 修饰的类可以指定子类。这样这个类就只能被指定的类继承。

    而且 sealed 修饰的类的机制具有传递性,它的子类必须使用指定的关键字进行修饰,且只能是 finalsealednon-sealed 三者之一。

    示例:犬类(Dog)只能被牧羊犬(Collie)和田园犬(TuGou)继承,使用 sealed 关键字。

    1. package com.wuliyouguocheng;
    2. public sealed interface Dog permits Collie, TuGou {
    3. //...
    4. }

    牧羊犬(Collie)只能被边境牧羊犬(BorderCollie)继承。

    1. package com.wuliyouguocheng;
    2. /**
    3. * 牧羊犬
    4. * @author wuliyouguocheng
    5. */
    6. public sealed class Collie implements Dog permits BorderCollie {
    7. }

    边境牧羊犬(BorderCollie)不能被继承,使用 final 关键字。

    1. package com.wuliyouguocheng;
    2. /**
    3. *
    4. * @author wuliyouguocheng
    5. */
    6. public final class BorderCollie extends Collie{
    7. }

    田园犬(ToGou)可以被任意继承,使用 non-sealed 关键字。

    1. package com.wuliyouguocheng;
    2. /**
    3. * @author wuliyouguocheng
    4. */
    5. public non-sealed class TuGou implements Dog {
    6. }

    3. JEP 371:Hidden Classes(隐藏类)

    这个特性让开发者可以引入一个无法被其他地方发现使用,且类的生命周期有限的类。这对运行时动态生成类的使用方式十分有利,可以减少内存占用,下面是一个使用示例。

    1. package com.wuliyouguocheng;
    2. public class JEP371Test {
    3. public static String lookup() {
    4. return "wuliyouguocheng";
    5. }
    6. }

    把类 JEP371Test 编译后的 Class 转换成 Base64,然后使用 Java 15 新特性加载调用类中的 lookup 方法。

    1. package com.wuliyouguocheng;
    2. import java.lang.invoke.MethodHandle;
    3. import java.lang.invoke.MethodHandles;
    4. import java.lang.invoke.MethodType;
    5. import java.util.Base64;
    6. /**
    7. * @author wuliyouguocheng
    8. */
    9. public class JEP371 {
    10. private static String CLASS_INFO = "yv66vgAAADQAFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAOd3d3LndkYnl0ZS5jb20HAAoBABVjb20vd2RieXRlL0pFUDM3MVRlc3QBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAF0xjb20vd2RieXRlL0pFUDM3MVRlc3Q7AQAGbG9va3VwAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAPSkVQMzcxVGVzdC5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAEAAEAEgAAAAIAEw==";
    11. public static void main(String[] args) throws Throwable {
    12. byte[] classInBytes = Base64.getDecoder().decode(CLASS_INFO);
    13. Class proxy = MethodHandles.lookup()
    14. .defineHiddenClass(classInBytes, true, MethodHandles.Lookup.ClassOption.NESTMATE)
    15. .lookupClass();
    16. System.out.println(proxy.getName());
    17. MethodHandle mh = MethodHandles.lookup().findStatic(proxy, "lookup", MethodType.methodType(String.class));
    18. String result = (String) mh.invokeExact();
    19. System.out.println(result);
    20. }
    21. }

    输出结果: 

    1. com.wuliyouguocheng.JEP371Test/0x0000000800c01800
    2. wuliyouguocheng

    4. JEP 372:移除 Nashorn JavaScript 引擎

    Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被标记为废弃。由于 ECMAScript 语言发展很快,维护 Nashorn JavaScript 的成本过于高昂,在 Java 15 中被彻底删除。

    5. JEP 373:重新实现 DatagramSocket API

    Java 13 中重新实现了旧的 Socket API,在介绍 Java 13 时还有一部分做了这方面的介绍。

    现在,Java 15 重新实现了遗留的 DatagramSocket

    6. JEP 374:禁用和废弃偏向锁(Biased Locking)

    在之前,JVM 在处理同步操作,如使用 synchronized 同步时,有一套锁的升级机制,其中有一个锁机制就是偏向锁。然而通过目前的 Java 开发环境来看,使用这些被 synchronized 同步的类的机会并不多,如开发者更喜欢使用 HashMap 或者 ArrayList 而非 HashTableVector

    即使换个角度,当初使用偏向锁是为了提高性能,如今看来性能提升的程度和使用次数都不太有用。而偏向锁的引入增加了 JVM 的复杂性。

    所以现在偏向锁被默认禁用,在不久的将来将会彻底删除,对于 Java 15,我们仍然可以使用 -XX:+UseBiasedLocking 启用偏向锁定,但它会提示 这是一个已弃用的 API。

    7. JEP 375:instanceof 类型匹配 (二次预览)

    instanceof 类型匹配在 Java 14 中已经改进,这次仅仅再次预览,没有任何改动,用于接受更多的使用反馈。这个特性在 Java 16 中成为正式特性。

    在之前,使用 instanceof 进行类型判断之后,需要进行对象类型转换后才能使用。

    1. package com.wuliyouguocheng;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class Java14BeaforInstanceof {
    5. public static void main(String[] args) {
    6. Object obj = new ArrayList<>();
    7. if (obj instanceof ArrayList) {
    8. ArrayList list = (ArrayList)obj;
    9. list.add("wuliyouguocheng");
    10. }
    11. System.out.println(obj);
    12. }
    13. }

    而在 Java 14 中,可以在判断类型时指定变量名称进行类型转换,方便了使用。

    1. package com.wuliyouguocheng;
    2. import java.util.ArrayList;
    3. public class Java14Instanceof {
    4. public static void main(String[] args) {
    5. Object obj = new ArrayList<>();
    6. if (obj instanceof ArrayList list) {
    7. list.add("wuliyouguocheng");
    8. }
    9. System.out.println(obj);
    10. }
    11. }

    可以看到,在使用 instanceof 判断类型成立后,会自动强制转换类型为指定类型。

    输出结果:

    [wuliyouguocheng]

    8. JEP 377:ZGC: 可扩展低延迟垃圾收集器(正式发布)

    ZGC 垃圾收集器在 Java 11 中被引入,但是因为收集器的复杂性,当初决定逐渐引入。然后不断的听取用户的反馈建议修复问题。而现在,已经很久没有收到用户的问题反馈了,ZGC 是时候投入正式使用阶段了。所以在 Java 15 中 ZGC 正式发布,可以使用下面的参数启用 ZGC。

    $ java -XX:+UseZGC className

    9. JEP 378: 文本块

    文本块在 Java 12 中引入,在 Java 13 中开始预览,在 Java 14 二次预览,而现在,在 Java 15 ,文本块是正式的功能特性了。

    1. String content = """
    2. {
    3. "upperSummary": null,\
    4. "sensitiveTypeList": null,
    5. "gmtModified": "2022-11-01\s10:50:09",
    6. }
    7. """;
    8. System.out.println(content);

    10. JEP 379:Shenandoah: 低停顿时间的垃圾收集器

    Shenandoah 垃圾收集器在 Java 12 中开始引入,Java 15 中成为了正式功能的一部分,可以使用下面的参数启用 Shenandoah 垃圾收集器。

    java -XX:+UseShenandoahGC
    

    但是 openJDK 15 中默认是没有 Shenandoah 收集器,想要使用此功能可以下载

    AdoptOpenJDK - Open source, prebuilt OpenJDK binaries

    为什么 openJDK 中没有 Shenandoah 垃圾收集器?

    Shenandoah 是一个高性能、低暂停时间的垃圾收集器,它是 Red Hat 主导的项目。当 Red Hat 第一次提议将 Shenandoah 贡献给 OpenJDK 时,Oracle 明确表示不想支持它,OpenJDK 作为一个免费软件,不想支持 Red Hat 的 Shenandoah 完全没有问题。

    最后 Red Hat 选择和 Oracle 合作设计一个真正干净的可插拔垃圾收集器接口,允许任何人轻松选择垃圾收集器以包含在他们的构建中。最终 Shenandoah 进入了 JDK 12,但是没有构建进 OpenJDK。

    11. JEP 384:Records(二次预览)

    在 Java 14 中引入了 Record 类,Java 15 中对 Record 进行了增强。使它可以支持密封类型、Record 注解以及相关的反射 API 等。

    示例:Record 支持密封(sealed)类型。

    1. package com.wuliyouguocheng;
    2. /**
    3. * @author wuliyouguocheng
    4. */
    5. public sealed interface DataBase permits DataBaseSelect, DataBaseUpdate {
    6. }
    7. final record DataBaseSelect(@Deprecated String table, String sql) implements DataBase {
    8. }
    9. final record DataBaseUpdate() implements DataBase {
    10. }

    java.lang.Class 增加了两个公共方法用于获取 Record 类信息:

    1. RecordComponent[] getRecordComponents()

    2. boolean isRecord()

    其他更新

    JEP 381:删除 Solaris 和 SPARC 端口

    Java 14 JEP 362

    (opens new window) 弃用了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口,现在它在 Java 15 中被正式删除。

    JEP 383:外部内存访问 API(第二个孵化器)

    JEP 385:废弃 RMI 激活机制

    只是废弃 RMI 激活机制,不影响 RMI 其他功能。

  • 相关阅读:
    「聊设计模式」之桥接模式(Bridge)
    Arduino平台软硬件原理及使用——开源库的使用
    WhatsApp Business 与 Google My Business:它们的运作方式和不同之处
    python实现简单的神经网络,python的神经网络编程
    IPKISS Tutorials 3------绘制矩形版图
    【Java 基础篇】Java TreeSet 详解:红黑树实现的有序集合
    C++关于导出*.dll文件中的函数方法
    入门力扣自学笔记134 C++ (题目编号658)
    windows消息机制
    【MLT】MLT多媒体框架生产消费架构解析(一)
  • 原文地址:https://blog.csdn.net/wuliyouMaozhi/article/details/127615139