关于java:超详细-Java-15-新功能介绍

8次阅读

共计 6964 个字符,预计需要花费 18 分钟才能阅读完成。

点赞再看,能源有限 。微信搜「 程序猿阿朗」,认认真真写文章。

本文 Github.com/niumoo/JavaNotes 和 未读代码博客 曾经收录,有很多知识点和系列文章。

<!–

–>
Java 15 在 2020 年 9 月公布,尽管不是短暂反对版本,然而也带来了 14 个新性能,这些新性能中有不少是非常实用的。

Java 15 官网下载:https://jdk.java.net/archive/

Java 15 官网文档:https://openjdk.java.net/proj…

<!– more –>

Java 15 新性能:

JEP 形容
JEP 339 爱德华曲线算法(EdDSA)
JEP 360 Sealed Classes(密封类)预览
JEP 371 Hidden Classes(暗藏类)
JEP 372 移除 Nashorn JavaScript 引擎
JEP 373 从新实现 DatagramSocket APII
JEP 374 禁用和废除偏差锁(Biased Locking)
JEP 375 instanceof 类型匹配 (二次预览)
JEP 377 ZGC: 可扩大低提早垃圾收集器(正式公布)
JEP 378 文本块
JEP 379 Shenandoah: 低进展工夫的垃圾收集器
JEP 381 删除 Solaris 和 SPARC 端口
JEP 383 内部内存拜访 API(第二个孵化器))
JEP 384 Records (二次预览)
JEP 385 废除 RMI 激活机制

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

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

package com.wdbyte;

import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import java.security.SignatureException;
import java.util.Base64;

public class JEP339 {public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
        KeyPair kp = kpg.generateKeyPair();
        byte[] msg = "www.wdbyte.com".getBytes(StandardCharsets.UTF_8);
        Signature sig = Signature.getInstance("Ed25519");
        sig.initSign(kp.getPrivate());
        sig.update(msg);
        byte[] s = sig.sign();
        System.out.println(Base64.getEncoder().encodeToString(s));
    }
}

输入后果:

VXlpxapU+LSWjVQ0QNJvdpUh6VI6PjSwOQ2pHu65bCfnLR13OyWKunlc9rc+7SMxCh2Mnqf7TmC/iOG8oimbAw==

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

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

而且 sealed 润饰的类的机制具备传递性,它的子类必须应用指定的关键字进行润饰,且只能是 final sealed non-sealed 三者之一。

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

package com.wdbyte;

public  sealed interface Dog permits Collie, TuGou {//...}

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

package com.wdbyte;

/**
 * 牧羊犬
 * @author www.wdbyte.com
 */
public sealed class Collie implements Dog permits BorderCollie {}

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

package com.wdbyte;

/**
 *
 * @author www.wdbyte.com
 */
public final class BorderCollie extends Collie{}

田园犬(ToGou)能够被任意继承,应用 non-sealed 关键字。

package com.wdbyte;

/**
 * @author niulang
 */
public non-sealed class TuGou implements Dog {}

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

这个个性让开发者能够引入一个无奈被其余中央发现应用,且类的生命周期无限的类。这对运行时动静生成类的应用形式非常无利,能够缩小内存占用,上面是一个应用示例。

package com.wdbyte;

public class JEP371Test {public static String lookup() {return "www.wdbyte.com";}
}

把类 JEP371Test 编译后的 Class 转换成 Base64,而后应用 Java 15 新个性加载调用类中的 lookup 办法。

package com.wdbyte;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Base64;

/**
 * @author www.wdbyte.com
 */
public class JEP371 {

    private static String CLASS_INFO = "yv66vgAAADQAFAoAAgADBwAEDAAFAAYBABBqYXZhL2xhbmcvT2JqZWN0AQAGPGluaXQ+AQADKClWCAAIAQAOd3d3LndkYnl0ZS5jb20HAAoBABVjb20vd2RieXRlL0pFUDM3MVRlc3QBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAF0xjb20vd2RieXRlL0pFUDM3MVRlc3Q7AQAGbG9va3VwAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAPSkVQMzcxVGVzdC5qYXZhACEACQACAAAAAAACAAEABQAGAAEACwAAAC8AAQABAAAABSq3AAGxAAAAAgAMAAAABgABAAAAAwANAAAADAABAAAABQAOAA8AAAAJABAAEQABAAsAAAAbAAEAAAAAAAMSB7AAAAABAAwAAAAGAAEAAAAEAAEAEgAAAAIAEw==";

    public static void main(String[] args) throws Throwable {byte[] classInBytes = Base64.getDecoder().decode(CLASS_INFO);
        Class<?> proxy = MethodHandles.lookup()
            .defineHiddenClass(classInBytes, true, MethodHandles.Lookup.ClassOption.NESTMATE)
            .lookupClass();

        System.out.println(proxy.getName());
        MethodHandle mh = MethodHandles.lookup().findStatic(proxy, "lookup", MethodType.methodType(String.class));
        String result = (String) mh.invokeExact();
        System.out.println(result);
    }
}

输入后果:

com.wdbyte.JEP371Test/0x0000000800c01800
www.wdbyte.com

4. JEP 372:移除 Nashorn JavaScript 引擎

Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被标记为废除。因为 ECMAScript 语言倒退很快,保护 Nashorn JavaScript 的老本过于昂扬,在 Java 15 中被彻底删除。

扩大浏览:Nashorn JavaScript Engine,Deprecate the Nashorn JavaScript Engine

5. JEP 373:从新实现 DatagramSocket API

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

当初,Java 15 从新实现了遗留的 DatagramSocket

扩大浏览:Java 13 新性能介绍

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 进行类型判断之后,须要进行对象类型转换后能力应用。

package com.wdbyte;

import java.util.ArrayList;
import java.util.List;

public class Java14BeaforInstanceof {public static void main(String[] args) {Object obj = new ArrayList<>();
        if (obj instanceof ArrayList) {ArrayList list = (ArrayList)obj;
            list.add("www.wdbyte.com");
        }
        System.out.println(obj);
    }
}

而在 Java 14 中,能够在判断类型时指定变量名称进行类型转换,不便了应用。

package com.wdbyte;

import java.util.ArrayList;

public class Java14Instanceof {public static void main(String[] args) {Object obj = new ArrayList<>();
        if (obj instanceof ArrayList list) {list.add("www.wdbyte.com");
        }
        System.out.println(obj);
    }
}

能够看到,在应用 instanceof 判断类型成立后,会主动强制转换类型为指定类型。

输入后果:

[www.wdbyte.com]

扩大浏览:Java 14 新性能介绍

8. JEP 377:ZGC: 可扩大低提早垃圾收集器(正式公布)

ZGC 垃圾收集器在 Java 11 中被引入,然而因为收集器的复杂性,当初决定逐步引入。而后一直的听取用户的反馈倡议修复问题。而当初,曾经很久没有收到用户的问题反馈了,ZGC 是时候投入正式应用阶段了。所以在 Java 15 中 ZGC 正式公布,能够应用上面的参数启用 ZGC。

$ java -XX:+UseZGC className

9. JEP 378:文本块

文本块在 Java 12 JEP 326 原始字符串文字 中引入,在 Java 13 JEP 355:文本块(预览)中开始预览,在 Java 14 JEP 368:文本块(第二次预览),而当初,在 Java 15,文本块是正式的性能个性了。

String content = """{"upperSummary": null,\"sensitiveTypeList": null,"gmtModified":"2011-08-05\s10:50:09",}
         """;
System.out.println(content);

扩大浏览:Java 14 新性能介绍 - JEP368 文本块

10. JEP 379:Shenandoah: 低进展工夫的垃圾收集器

Shenandoah 垃圾收集器在 Java 12 中开始引入,Java 15 中成为了正式性能的一部分,能够应用上面的参数启用 Shenandoah 垃圾收集器。

java -XX:+UseShenandoahGC

然而 openJDK 15 中默认是没有 Shenandoah 收集器,想要应用此性能能够下载 AdoptOpenJDK。

为什么 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)类型。

package com.wdbyte;

/**
 * @author www.wdbyte.com
 */
public sealed interface DataBase permits DataBaseSelect, DataBaseUpdate {
}

final record DataBaseSelect(@Deprecated String table, String sql) implements DataBase {
}

final record DataBaseUpdate() implements DataBase {}

java.lang.Class 减少了两个公共办法用于获取 Record 类信息:

  1. RecordComponent[] getRecordComponents()
  2. boolean isRecord()

其余更新

JEP 381:删除 Solaris 和 SPARC 端口

Java 14 JEP 362 弃用了 Solaris/SPARC、Solaris/x64 和 Linux/SPARC 端口,当初它在 Java 15 中被正式删除。

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

JEP 385:废除 RMI 激活机制

只是废除 RMI 激活机制,不影响 RMI 其余性能。

参考

  1. https://openjdk.java.net/proj…
  2. https://docs.oracle.com/en/ja…
  3. https://mkyong.com/java/what-…

订阅

Hello world : ) 我是阿朗,一线技术工具人,认认真真写文章。

点赞 的个个都是人才,不仅长得帅气难看,谈话还好听。

文章继续更新,能够关注公众号「程序猿阿朗」或拜访「未读代码博客」。

回复【材料】有我筹备的各系列知识点和必看书籍。

本文 Github.com/niumoo/JavaNotes 曾经收录,有很多知识点和系列文章,欢送 Star。

正文完
 0