欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java15新功能的詳細講解

 更新時間:2021年08月19日 10:43:49   作者:程序猿阿朗  
這篇文章主要介紹了java15的新功能,雖然java15并不是長期支持的版本,但是很多新功能還是很有用的。感興趣的小伙伴可以參考一下

Java 15 在 2020 年 9 月發(fā)布,雖然不是長久支持版本,但是也帶來了 14 個新功能,這些新功能中有不少是十分實用的。

Java 15 官方下載:https://jdk.java.net/archive/

Java 15 官方文檔:https://openjdk.java.net/projects/jdk/15/

Java 15 新功能:

JEP 描述
JEP 339 愛德華曲線算法(EdDSA)
JEP 360 Sealed Classes(密封類)預(yù)覽
JEP 371 Hidden Classes(隱藏類)
JEP 372 移除 Nashorn JavaScript 引擎
JEP 373 重新實現(xiàn) DatagramSocket APII
JEP 374 禁用和廢棄偏向鎖(Biased Locking)
JEP 375 instanceof 類型匹配 (二次預(yù)覽)
JEP 377 ZGC: 可擴展低延遲垃圾收集器(正式發(fā)布)
JEP 378 文本塊
JEP 379 Shenandoah: 低停頓時間的垃圾收集器
JEP 381 刪除 Solaris 和 SPARC 端口
JEP 383 外部內(nèi)存訪問 API(第二個孵化器))
JEP 384 Records (二次預(yù)覽)
JEP 385 廢棄 RMI 激活機制

1. JEP 339 愛德華曲線算法(EdDSA)

Java 15 中增加了一個新的密碼學(xué)算法,愛德華曲線算法(EdDSA)簽名算法。它是由 Schnorr 算法發(fā)展而來,在 RFC8032 中被定義實現(xiàn)。

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));
    }
}

輸出結(jié)果:

VXlpxapU+LSWjVQ0QNJvdpUh6VI6PjSwOQ2pHu65bCfnLR13OyWKunlc9rc+7SMxCh2Mnqf7TmC/iOG8oimbAw==

2. JEP 360:Sealed Classes(密封類)預(yù)覽

我們都知道,在 Java 中如果想讓一個類不能被繼承和修改,這時我們應(yīng)該使用 final 關(guān)鍵字對類進行修飾。不過這種要么可以繼承,要么不能繼承的機制不夠靈活,有些時候我們可能想讓某個類可以被某些類型繼承,但是又不能隨意繼承,是做不到的。Java 15 嘗試解決這個問題,引入了 sealed 類,被 sealed 修飾的類可以指定子類。這樣這個類就只能被指定的類繼承。

而且 sealed 修飾的類的機制具有傳遞性,它的子類必須使用指定的關(guān)鍵字進行修飾,且只能是 final 、sealed 、non-sealed 三者之一。

示例:犬類(Dog)只能被牧羊犬(Collie)和田園犬(TuGou)繼承,使用 sealed 關(guān)鍵字。

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 關(guān)鍵字。

package com.wdbyte;

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

田園犬(ToGou)可以被任意繼承,使用 non-sealed 關(guān)鍵字。

package com.wdbyte;

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

3. JEP 371:Hidden Classes(隱藏類)

這個特性讓開發(fā)者可以引入一個無法被其他地方發(fā)現(xiàn)使用,且類的生命周期有限的類。這對運行時動態(tài)生成類的使用方式十分有利,可以減少內(nèi)存占用,下面是一個使用示例。

package com.wdbyte;

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

把類 JEP371Test 編譯后的 Class 轉(zhuǎn)換成 Base64,然后使用 Java 15 新特性加載調(diào)用類中的 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);
    }
}

輸出結(jié)果:

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

4. JEP 372:移除 Nashorn JavaScript 引擎

Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被標記為廢棄。由于 ECMAScript 語言發(fā)展很快,維護 Nashorn JavaScript 的成本過于高昂,在 Java 15 中被徹底刪除。

擴展閱讀:Nashorn JavaScript EngineDeprecate the Nashorn JavaScript Engine

5. JEP 373:重新實現(xiàn) DatagramSocket API

Java 13 中重新實現(xiàn)了舊的 Socket API,在介紹 Java 13 時還有一部分做了這方面的介紹。

現(xiàn)在,Java 15 重新實現(xiàn)了遺留的 DatagramSocket。

擴展閱讀:Java 13 新功能介紹

6. JEP 374:禁用和廢棄偏向鎖(Biased Locking)

在之前,JVM 在處理同步操作,如使用 synchronized 同步時,有一套鎖的升級機制,其中有一個鎖機制就是偏向鎖。然而通過目前的 Java 開發(fā)環(huán)境來看,使用這些被 synchronized 同步的類的機會并不多,如開發(fā)者更喜歡使用 HashMap 或者 ArrayList 而非 HashTable 和 Vector。

即使換個角度,當初使用偏向鎖是為了提高性能,如今看來性能提升的程度和使用次數(shù)都不太有用。而偏向鎖的引入增加了 JVM 的復(fù)雜性。

所以現(xiàn)在偏向鎖被默認禁用,在不久的將來將會徹底刪除,對于 Java 15,我們?nèi)匀豢梢允褂?XX:+UseBiasedLocking 啟用偏向鎖定,但它會提示 這是一個已棄用的 API。

7. JEP 375:instanceof 類型匹配 (二次預(yù)覽)

instanceof 類型匹配在 Java 14 中已經(jīng)改進,這次僅僅再次預(yù)覽,沒有任何改動,用于接受更多的使用反饋。這個特性在 Java 16 中成為正式特性。

在之前,使用 instanceof 進行類型判斷之后,需要進行對象類型轉(zhuǎn)換后才能使用。

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 中,可以在判斷類型時指定變量名稱進行類型轉(zhuǎn)換,方便了使用。

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 判斷類型成立后,會自動強制轉(zhuǎn)換類型為指定類型。

輸出結(jié)果:

[www.wdbyte.com]

擴展閱讀:Java 14 新功能介紹

8. JEP 377:ZGC: 可擴展低延遲垃圾收集器(正式發(fā)布)

ZGC 垃圾收集器在 Java 11 中被引入,但是因為收集器的復(fù)雜性,當初決定逐漸引入。然后不斷的聽取用戶的反饋建議修復(fù)問題。而現(xiàn)在,已經(jīng)很久沒有收到用戶的問題反饋了,ZGC 是時候投入正式使用階段了。所以在 Java 15 中 ZGC 正式發(fā)布,可以使用下面的參數(shù)啟用 ZGC。

$ java -XX:+UseZGC className

9. JEP 378: 文本塊

文本塊在 Java 12 JEP 326 原始字符串文字 中引入,在 Java 13 JEP 355:文本塊(預(yù)覽) 中開始預(yù)覽,在 Java 14 JEP 368:文本塊(第二次預(yù)覽),而現(xiàn)在,在 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 中成為了正式功能的一部分,可以使用下面的參數(shù)啟用 Shenandoah 垃圾收集器。

java -XX:+UseShenandoahGC

但是 openJDK 15 中默認是沒有 Shenandoah 收集器,想要使用此功能可以下載 AdoptOpenJDK。

為什么 openJDK 中沒有 Shenandoah 垃圾收集器?

Shenandoah 是一個高性能、低暫停時間的垃圾收集器,它是 Red Hat 主導(dǎo)的項目。當 Red Hat 第一次提議將 Shenandoah 貢獻給 OpenJDK 時,Oracle 明確表示不想支持它,OpenJDK 作為一個免費軟件,不想支持 Red Hat 的 Shenandoah 完全沒有問題。

最后 Red Hat 選擇和 Oracle 合作設(shè)計一個真正干凈的可插拔垃圾收集器接口,允許任何人輕松選擇垃圾收集器以包含在他們的構(gòu)建中。最終 Shenandoah 進入了 JDK 12,但是沒有構(gòu)建進 OpenJDK。

11. JEP 384:Records(二次預(yù)覽)

在 Java 14 中引入了 Record 類,Java 15 中對 Record 進行了增強。使它可以支持密封類型、Record 注解以及相關(guān)的反射 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 端口,現(xiàn)在它在 Java 15 中被正式刪除。

JEP 383:外部內(nèi)存訪問 API(第二個孵化器)

JEP 385:廢棄 RMI 激活機制

只是廢棄 RMI 激活機制,不影響 RMI 其他功能。

參考

https://openjdk.java.net/projects/jdk/15/

https://docs.oracle.com/en/java/javase/14/docs/specs/rmi/activation.html

https://mkyong.com/java/what-is-new-in-java-15/

到此這篇關(guān)于java15新功能的詳細講解的文章就介紹到這了,更多相關(guān)java15新功能介紹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談java常量池

    淺談java常量池

    下面小編就為大家?guī)硪黄獪\談java常量池。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • java中對List分段操作的實例

    java中對List分段操作的實例

    這篇文章主要介紹了java中對List分段操作的實例的相關(guān)資料,希望通過本文大家能夠掌握list的分段實現(xiàn)方法,需要的朋友可以參考下
    2017-09-09
  • 詳解Java多線程編程中線程的啟動、中斷或終止操作

    詳解Java多線程編程中線程的啟動、中斷或終止操作

    在Java中start和tun方法可用被用來啟動線程,而用interrupt方法來中斷或終止線程,以下我們就來詳解Java多線程編程中線程的啟動、中斷或終止操作
    2016-07-07
  • 關(guān)于SpringBoot整合RabbitMQ實現(xiàn)死信隊列

    關(guān)于SpringBoot整合RabbitMQ實現(xiàn)死信隊列

    這篇文章主要介紹了關(guān)于SpringBoot整合RabbitMQ實現(xiàn)死信隊列,死信隊列實際上就是一個普通的隊列,只是這個隊列跟死信交換機進行了綁定,用來存放死信而已,需要的朋友可以參考下
    2023-05-05
  • Linux下Java環(huán)境變量的安裝與配置

    Linux下Java環(huán)境變量的安裝與配置

    這篇文章給大家介紹了Linux下Java環(huán)境變量的安裝與配置,本文以jdk1.6.0_43為例,給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • springboot+webmagic實現(xiàn)java爬蟲jdbc及mysql的方法

    springboot+webmagic實現(xiàn)java爬蟲jdbc及mysql的方法

    今天小編就為大家分享一篇springboot+webmagic實現(xiàn)java爬蟲jdbc及mysql的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 詳解Java線程池如何實現(xiàn)優(yōu)雅退出

    詳解Java線程池如何實現(xiàn)優(yōu)雅退出

    這篇文章我們將從源碼角度深度解析線程池是如何優(yōu)雅的退出程序的,文中的示例代碼講解詳細,對我們學(xué)習(xí)java線程池有一定幫助,需要的可以參考一下
    2022-07-07
  • IntelliJ IDEA修改新建文件自動生成注釋的user名

    IntelliJ IDEA修改新建文件自動生成注釋的user名

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA修改新建文件自動生成注釋的user名,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java中父類怎么調(diào)用子類的方法

    Java中父類怎么調(diào)用子類的方法

    這篇文章主要介紹了Java父類調(diào)用子類的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Spring mvc文件上傳下載代碼實例

    Spring mvc文件上傳下載代碼實例

    這篇文章主要介紹了Spring mvc文件上傳下載代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03

最新評論