Java9、10装黑、11副瀑、12、13恋谭、14糠睡、15、16疚颊、17個版本新特性

Java9新特性

1 模塊化系統(tǒng)

模塊(module)的概念狈孔,其實就是package外再裹一層,也就是說材义,用模塊來管理各個package均抽,通過聲明某個package暴露,不聲明默認就是隱藏其掂。因此油挥,模塊化使得代碼組織上更安全,因為它可以指定哪些部分可以暴露,哪些部分隱藏深寥。

導出模塊

被引用模塊需要導出指定的文件夾攘乒,并且在根目錄下定義 module-info.java 文件,編寫需要導出的文件包全路徑名惋鹅。

module modulea {
    exports com.lz.java9.bean2;
    exports com.lz.java9.bean;
}

引用模塊

在引用項目的根目錄下新建一個 module-info.java 文件则酝,如果不新建module-info文件,模塊化不生效闰集,可以調用包中的所有類沽讹,編寫需要引入的模塊名稱。

module moduleb {
    requires modulea;
}

2 jshell

JShell的目標是提供一個交互工具武鲁,通過它來運行和計算java中的表達式妥泉。開發(fā)者可以輕松地與JShell交互,其中包括:編輯歷史洞坑,tab鍵代碼補全盲链,自動添加分號,可配置的imports和definitions迟杂。其他的很多主流編程語言如python都已經提供了console刽沾,便于編寫一些簡單的代碼用于測試。

demo

jshell> for(int i=0; i<10; i++){
   ...> System.out.println(i);
   ...> }
0
1
2
3
4
5
6
7
8
9

3 多版本兼容jar包

多版本兼容 JAR 功能能讓你創(chuàng)建僅在特定版本的 Java 環(huán)境中運行庫程序時選擇使用的 class 版本排拷。通過 --release 參數指定編譯版本侧漓。具體的變化就是 META-INF 目錄下 MANIFEST.MF 文件新增了一個屬性:

Multi-Release: true

然后 META-INF 目錄下還新增了一個 versions 目錄,如果是要支持 java9监氢,則在 versions 目錄下有 9 的目錄布蔗。

multirelease.jar
├── META-INF
│   └── versions
│       └── 9
│           └── multirelease
│               └── Helper.class
├── multirelease
    ├── Helper.class
    └── Main.class

實例

使用多版本兼容 JAR 功能將 Tester.java 文件生成了兩個版本的 jar 包, 一個是 jdk 7,另一個是 jdk 9浪腐,然后我們再不同環(huán)境下執(zhí)行纵揍。

java8

public class Tester {
   public static void main(String[] args) {
      System.out.println("Inside java 8");
   }
}

java9

public class Tester {
   public static void main(String[] args) {
      System.out.println("Inside java 9");
   }
}

編譯兩個文件

javac --release 9 Tester.java
javac --release 8 Tester.java

創(chuàng)建多版本兼容 jar 包

jar -c -f test.jar -C java7 . --release 9 -C java9.

在不同的jdk環(huán)境下執(zhí)行打印不同的結果

4 接口中聲明私有方法

5 鉆石操作符使用升級

6 異常處理try-with-resources改進

9之前

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Tester {
   public static void main(String[] args) throws IOException {
      System.out.println(readData("test"));
   }
   static String readData(String message) throws IOException {
      Reader inputString = new StringReader(message);
      BufferedReader br = new BufferedReader(inputString);
      try (BufferedReader br1 = br) {
         return br1.readLine();
      }
   }
}

9之后

在 Java 9 中,我們不需要聲明資源 br1 就可以使用它议街,并得到相同的結果泽谨。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Tester {
   public static void main(String[] args) throws IOException {
      System.out.println(readData("test"));
   }
   static String readData(String message) throws IOException {
      Reader inputString = new StringReader(message);
      BufferedReader br = new BufferedReader(inputString);
      try (br) {
         return br.readLine();
      }
   }
}

7 _ 下劃線命名標識符不能單獨使用

8 String 底層存儲結構發(fā)生變化使用字節(jié)數組

創(chuàng)建不可變集合

    List<String> list = List.of("1", "2", "q");
    Set<String> set = Set.of("aa", "bb", "cc", "dd");
    Map<String, Integer> map = Map.of("aa", 1, "bb", 2);

9 增強Stream API

takeWhile 從Stream中依次獲取滿足條件的元素,直匹配到一個不滿足條件為止結束獲取特漩,不同與filter

    List<Integer> list = List.of(11,33,44,102,232,454,67,556,46,78);
    list.stream().takeWhile(x -> x < 100).forEach(System.out::println);
// 輸出結果如下
11
33
44

dropWhile 從Stream中依次刪除滿足條件的元素吧雹,直到匹配到一個不滿足條件為止結束刪除

    List<Integer> list = List.of(11,33,44,102,232,454,67,556,46,78);
    list.stream().dropWhile(x -> x < 100).forEach(System.out::println);
// 輸出結果如下
102
232
454
67
556
46
78

Stream.ofNullable(null) 允許單一的null元素

Stream.iterate重載方法

    Stream.iterate(0, k -> k + 1).limit(12).forEach(System.out::println);
    // 9 新增的重載方法
    Stream.iterate(0, k -> k < 12, k -> k + 1).forEach(System.out::println);

10 Optional新增元素轉化為stream()方法等

Optional.of(List.of(1, 23, 4, 5, 6)).stream().forEach(System.out::println);

11 多分辨率圖像API

12 全新的HTTP客戶端API(Java11才正式可用進行了修改和包名改變)

    HttpClient httpClient = HttpClient.newHttpClient();
    HttpRequest httpRequest = HttpRequest
                    .newBuilder(new URI("https://www.baidu.com"))
                    .GET()
                    .build();
    HttpResponse<String> response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());

12 InputStream 增加transferTo方法,將數據直接傳輸到輸出流中

13 統(tǒng)一的JVM日志

Java10新特性

1涂身、局部變量的類型推斷 var關鍵字

    var list = new ArrayList<String>();
    list.add("hello雄卷,world!");
    System.out.println(list);

2蛤售、GC改進和內存管理 并行全垃圾回收器 G1

3丁鹉、新增API:ByteArrayOutputStream

4陕凹、新增API:List、Map鳄炉、Set

5、新增API:java.util.Properties

6搜骡、新增API: Collectors收集器

7拂盯、Optional 新增orElseThrow方法

8、基于Java的實驗性JIT編譯器

Java 10 開啟了 Java JIT編譯器 Graal记靡,用作Linux / x64平臺上的實驗性JIT編譯器谈竿。

其它特性

Java11新特性

1、字符串新增方法

    String str = " qq eeee  ";
    System.out.println(str.isBlank());// 是否為空
    System.out.println(str.strip());// 去除開頭結尾空格
    System.out.println(str.stripLeading());// 去除頭部空格
    System.out.println(str.stripTrailing());// 去除尾部空格
    System.out.println(str.repeat(3));// 復制三次
    System.out.println(str.lines().count());// 行數操作統(tǒng)計

2摸吠、Optional isEmpty方法

3空凸、局部變量類型推斷升級

   Consumer<String> con = (@Deprecated var c) -> System.out.println(c.toLowerCase());

4、確認HttpClient使用寸痢,標準化并修改優(yōu)化

5呀洲、java命令直接運行源文件,不需要事先javac編譯

6啼止、引入實驗性的 ZGC

Java12新特性

1道逗、更簡潔的 switch 語法(預覽功能)

在之前的 JAVA 版本中,switch 語法還是比較啰嗦的献烦,如果多個值走一個邏輯需要寫多個 case

DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
String typeOfDay = "";
switch (dayOfWeek) {
    case MONDAY:
    case TUESDAY:
    case WEDNESDAY:
    case THURSDAY:
    case FRIDAY:
        typeOfDay = "Working Day";
        break;
    case SATURDAY:
    case SUNDAY:
        typeOfDay = "Day Off";
}

Java12

typeOfDay = switch (dayOfWeek) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Working Day";
    case SATURDAY, SUNDAY -> "Day Off";
};

//特定場景的計算邏輯
int day = 1;
int result = switch (day) {
    case 1, 2, 3, 4, 5 -> 1;
    case 6, 7 -> 2;
    default -> 0;
};
System.out.println(result);

2滓窍、核心庫java.lang中支持Unicode11

1、684個新角色 1.1巩那、66個表情符號字符 1.2吏夯、Copyleft符號 1.3、評級系統(tǒng)的半星 1.4即横、額外的占星符號 1.5噪生、象棋中國象棋符號 2、11個新區(qū)塊 2.1东囚、格魯吉亞擴展 2.2杠园、瑪雅數字 2.3、印度Siyaq數字 2.4舔庶、國際象棋符號 3抛蚁、7個新腳本 3.1、Hanifi Rohingya 3.2惕橙、Old Sogdian 3.3瞧甩、Sogdian 3.4、Dogra 3.5弥鹦、Gunjala Gondi 3.6肚逸、Makasar 3.7爷辙、Medefaidrin

3、核心庫java.text支持壓縮數字格式

System.out.println(NumberFormat.getCompactNumberInstance().format(10000000));
// 輸出結果:1000萬

4朦促、Collectors.teeing 新增方法

Collectors.teeing: 將 downstream1 和 downstream2 的流入合并膝晾,然后從 merger 流出

import java.util.stream.Collectors;
import java.util.stream.Stream;

public class SwitchDemo {
    public static void main(String[] args) {
        CountSum countsum = Stream.of(2, 11, 1, 5, 7, 8, 12)
                .collect(Collectors.teeing(
                        Collectors.counting(),
                        Collectors.summingInt(e -> e),
                        CountSum::new));

        System.out.println(countsum.toString());
    }
}
class CountSum {
    private final Long count;
    private final Integer sum;
    public CountSum(Long count, Integer sum) {
        this.count = count;
        this.sum = sum;
    }

    @Override
    public String toString() {
        return "CountSum{" +
                "count=" + count +
                ", sum=" + sum +
                '}';
    }
}

5、安全庫javax.net.ssl

ChaCha20和Poly1305 TLS密碼

JSSE中添加了使用ChaCha20-Poly1305算法的新TLS密碼套件务冕。默認情況下啟用這些密碼套件血当。TLS_CHACHA20_POLY1305_SHA256密碼套件適用于TLS 1.3。

6禀忆、移除項

核心庫/ java.util.jar中臊旭,刪除java.util.ZipFile / Inflator / Deflator中的finalize方法

核心庫/ java.util.jar中,刪除java.util.ZipFile / Inflator / Deflator中的finalize方法

工具/ javac的刪除javac支持6 / 1.6源箩退,目標和發(fā)布值

7离熏、JVM常量API

引入API來模擬關鍵類文件和運行時工件的名義描述,特別是可從常量池加載的常量戴涝。

在新的 java.lang.invoke.constant 包中定義了一系列基于值的符號引用(JVMS 5.1)類型滋戳,它們能夠描述每種可加載常量。

符號引用以純 nominal 形式描述可加載常量啥刻,與類加載或可訪問性上下文區(qū)分開胧瓜。有些類可以作為自己的符號引用(例如 String),而對于可鏈接常量郑什,定義了一系列符號引用類型(ClassDesc府喳、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc)蘑拯,它們包含描述這些常量的 nominal 信息钝满。

8、只保留一個 AArch64 實現(源碼)

在保留 32 位 ARM 實現和 64 位 aarch64 實現的同時申窘,刪除與 arm64 實現相關的所有源碼弯蚜。

JDK 中存在兩套 64 位 ARM 實現,主要存在于 src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目錄剃法。兩者都實現了 aarch64碎捺,現在將只保留后者,刪除由 Oracle 提供的 arm64贷洲。這將使貢獻者將他們的精力集中在單個 64 位 ARM 實現上收厨,并消除維護兩套實現所需的重復工作。

9优构、默認CDS檔案

針對 64 位平臺诵叁,使用默認類列表增強 JDK 構建過程,以生成類數據共享(class data-sharing钦椭,CDS)歸檔拧额。

10碑诉、G1的可流動混合收集

如果G1混合集合可能超過暫停目標,則使其可以中止侥锦。

11进栽、G1 及時返回未使用的已分配內存

增強 G1 GC,以便在空閑時自動將 Java 堆內存返回給操作系統(tǒng)恭垦。

為了實現向操作系統(tǒng)返回最大內存量的目標快毛,G1 將在應用程序不活動期間定期執(zhí)行或觸發(fā)并發(fā)周期以確定整體 Java 堆使用情況。這將導致它自動將 Java 堆的未使用部分返回給操作系統(tǒng)署照。而在用戶控制下,可以可選地執(zhí)行完整的 GC吗浩,以使返回的內存量最大化建芙。

12、JDK12之Shenandoah低暫停時間垃圾收集器(實驗性)

添加一個名為Shenandoah的新垃圾收集(GC)算法懂扼,通過與正在運行的Java線程同時進行疏散工作來減少GC暫停時間禁荸。使用Shenandoah的暫停時間與堆大小無關, 這意味著無論堆是200MB還是200GB阀湿,您都將具有相同的一致暫停時Shenandoah是適用于評估響應性和可預測的短暫停頓 的應用程序的算法赶熟。目標不是解決所有JVM暫停問題。由于GC之外的其他原因(例如安全時間點(TTSP)發(fā)布或監(jiān)控通脹)而暫停時間超出了此JEP的范圍陷嘴。

13映砖、JDK12之Microbenchmark Suite

在JDK源代碼中添加一套基本的微基準測試,使開發(fā)人員可以輕松運行現有的微基準測試并創(chuàng)建新的基準測試灾挨。

Java13新特性

1邑退、switch 語法再增強

JAVA 12 中雖然增強了 swtich 語法,但并不能在 -> 之后寫復雜的邏輯劳澄,JAVA 12 帶來了 swtich更完美的體驗地技,就像 lambda一樣,可以寫邏輯秒拔,然后再返回

typeOfDay = switch (dayOfWeek) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> {
        // do sth...
        yield "Working Day";
    }
    case SATURDAY, SUNDAY -> "Day Off";
};

2莫矗、多行文本塊(預覽)

13之前

 String html = "<html>\n" +
                "    <body>\n" +
                "        <p>Hello, world</p>\n" +
                "    </body>\n" +
                "</html>\n";

13

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

3、重新實現傳統(tǒng)套接字API

使用更簡單砂缩,更現代的實現替換java.net.Socket和java.net.ServerSocketAPI使用的底層實現作谚,
易于維護和調試。

新的實現旨在易于適應使用用戶模式線程(也稱為光纖)庵芭,這些線程正在Project Loom中進行探索食磕。上述傳統(tǒng)API可以追溯到JDK 1.0,并且包含傳統(tǒng)C和Java代碼的混合喳挑,這些代碼被描述為調試和維護的痛苦彬伦。遺留實現還存在其他問題:支持異步關閉滔悉,導致可靠性和移植問題的本機數據結構,以及需要徹底檢查的并發(fā)問題单绑。

4回官、API增加新方法

FileSystems.newFileSystem新方法

核心庫/ java.nio中添加了FileSystems.newFileSystem(Path,Map <String搂橙,歉提?>)方法,添加了三種新方法java.nio.file.FileSystems区转,以便更輕松地使用將文件內容視為文件系統(tǒng)的文件系統(tǒng)提供程序苔巨。

nio新方法

核心庫/ java.nio中新的java.nio.ByteBuffer批量獲取/放置方法轉移字節(jié)而不考慮緩沖區(qū)位置。

核心庫/ java.util中:I18N

支持Unicode 12.1废离,此版本將Unicode支持升級到12.1侄泽,其中包括以下內容:

java.lang.Character支持12.1級的Unicode字符數據庫,其中12.0從11.0開始增加554個字符蜻韭,
總共137,928個字符悼尾。這些新增內容包括4個新腳本,總共150個腳本肖方,以及61個新的表情符號字符闺魏。
U+32FF SQUARE ERA NAME REIWA從12.0開始,12.1只添加一個字符俯画。java.text.Bidi和
java.text.Normalizer類分別支持12.0級的Unicode標準附件析桥,#9和#15。
java.util.regexpackage支持基于12.0級Unicode標準附件#29的擴展字形集群艰垂。

5烹骨、增強ZGC

增強ZGC以將未使用的堆內存返回給操作系統(tǒng)。

ZGC目前沒有取消提交并將內存返回給操作系統(tǒng)材泄,即使該內存長時間未使用沮焕。對于所有類型的應用
程序和環(huán)境,此行為并非最佳拉宗,尤其是那些需要關注內存占用的應用程序和環(huán)境 例如:通過使用支付資
源的容器環(huán)境峦树。應用程序可能長時間處于空閑狀態(tài)并與許多其他應用程序共享或競爭資源的環(huán)境。應用
程序在執(zhí)行期間可能具有非常不同的堆空間要求旦事。
例如魁巩,啟動期間所需的堆可能大于穩(wěn)態(tài)執(zhí)行期間稍后所需的堆。HotSpot中的其他垃圾收集器姐浮,如
G1和Shenandoah谷遂,提供了這種功能,某些類別的用戶發(fā)現它非常有用卖鲤。將此功能添加到ZGC將受到同一
組用戶的歡迎肾扰。

Java14新特性

1畴嘶、Switch(最終版)

和之前的jdk12、13功能一樣集晚,只不過確定下來為最終版

2窗悯、Record(預覽功能)

使用它可以替代構造器、equal方法偷拔、toString方法蒋院,hashCode方法

public record Point(int x, int y) {
}

 public static void main(String[] args) {
        System.out.println(new Point(1,2));
 }

由于用record聲明的類,已經繼承了java.lang.Record 故莲绰,record 不能在顯示的繼承其它類欺旧。

為了對record 的支持,java.lang.Class引入了isRecord( )和getRecordComponents( )方法蛤签。其中isRecord( )為判斷一個類是否用record進行聲明的辞友,getRecordComponents( )獲取record 中的屬性數組RecordComponent[ ]。該數組中包含屬性的類型顷啼,和屬性的值踏枣。

3昌屉、instanceof的模式匹配(預覽版)

Object o = new String("test");
if (o instanceof String str) {
    System.out.println(str);
} else{
    // System.out.println(str); 報錯
}

4钙蒙、NullPointerExceptions 錯誤棧

Java14之前,NEP報錯信息不會指出為Null的實例具體是那一個间驮。例如:a.b.c.d 出現NEP時躬厌,開發(fā)者無法確定究竟是a、b竞帽、c扛施、d中的那個變量報了空指針。而在這個新特點的加入之后屹篓,NEP錯誤棧則會明確表明疙渣,觸發(fā)NEP的對象是哪個。

    public static void main(String[] args) {
        A a = new A();
        a.b.toString();
    }

    static class A {
        B b;
    }

    static class B {

    }

// 運行結果明確指出 a.b 是null
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Object.toString()" because "a.b" is null
        at com.lz.java12.Test.main(Test.java:6)

// 改動再次運行
    A a = null;
    a.b.toString();
// 明確指出 a 是 null
Exception in thread "main" java.lang.NullPointerException: Cannot read field "b" because "a" is null
        at com.lz.java12.Test.main(Test.java:6)
    

5堆巧、打包工具 (Incubator)

jpackage打包工具可以將Java應用程序打包為針對特定平臺的安裝包妄荔,這個安裝包包含所有必需的依賴項。該應用程序可以以普通JAR文件集合或模塊集合的方式提供谍肤。軟件包格式可以分為:

  • Linux:deb和rpm
  • macOS:pkg和dmg
  • Windows:msi和exe

6啦租、垃圾回收器(更新優(yōu)化)

  • 移除 CMS(Concurrent Mark Sweep)垃圾收集器
  • ZGC優(yōu)化window和mac
  • 棄用 ParallelScavenge + SerialOld GC 組合

7、外部存儲器訪問 API(孵化)

目的是引入一個 API荒揣,以允許 Java 程序安全篷角、有效地訪問 Java 堆之外的外部存儲器。如本機系任、持久和托管堆恳蹲。

Java15新特性

1虐块、Edwards-Curve 數字簽名算法

Java15引入了Edwards-Curve(EdDSA)數據簽名算法,EdDAS具有更好的性能和更高的安全性。

// example: generate a key pair and sign
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
KeyPair kp = kpg.generateKeyPair();
// algorithm is pure Ed25519
Signature sig = Signature.getInstance("Ed25519");
sig.initSign(kp.getPrivate());
sig.update(msg);
byte[] s = sig.sign();

// example: use KeyFactory to contruct a public key
KeyFactory kf = KeyFactory.getInstance("EdDSA");
boolean xOdd = ...
BigInteger y = ...
NamedParameterSpec paramSpec = new NamedParameterSpec("Ed25519");
EdECPublicKeySpec pubSpec = new EdECPublicKeySpec(paramSpec, new EdPoint(xOdd, y));
PublicKey pubKey = kf.generatePublic(pubSpec);

2阱缓、封閉類(預覽)

封閉類和接口主要限制能被哪些類擴展或實現非凌,增加開發(fā)人員對定義的類或接口進行管控,實現該類需要得到定義者允許荆针。

密閉類修飾符 sealed

指定可擴展修飾符 permits

public abstract sealed class Shape
    permits Circle, Rectangle, Square {...}

密閉類 Shape敞嗡,定義了三個允許的子類。

預覽版作為了解航背,更多特性見:JEP 360: Sealed Classes (Preview) (java.net)

3喉悴、隱藏類

標準 API 來定義無法發(fā)現且具有有限生命周期的隱藏類,從而提高 JVM 上所有語言的效率玖媚。JDK內部和外部的框架將能夠動態(tài)生成類箕肃,而這些類可以定義隱藏類。通常來說基于JVM的很多語言都有動態(tài)生成類的機制今魔,這樣可以提高語言的靈活性和效率勺像。

  • 隱藏類天生為框架設計的,在運行時生成內部的class错森。
  • 隱藏類只能通過反射訪問吟宦,不能直接被其他類的字節(jié)碼訪問。
  • 隱藏類可以獨立于其他類加載涩维、卸載殃姓,這可以減少框架的內存占用。

不能直接被其他class的二進制代碼使用的class瓦阐。隱藏類主要被一些框架用來生成運行時類蜗侈,但是這些類不是被用來直接使用的,而是通過反射機制來調用睡蟋。

比如在JDK8中引入的lambda表達式踏幻,JVM并不會在編譯的時候將lambda表達式轉換成為專門的類,而是在運行時將相應的字節(jié)碼動態(tài)生成相應的類對象戳杀。

  • java.lang.reflect.Proxy可以定義隱藏類作為實現代理接口的代理類该面。
  • java.lang.invoke.StringConcatFactory可以生成隱藏類來保存常量連接方法;
  • java.lang.invoke.LambdaMetaFactory可以生成隱藏的nestmate類豺瘤,以容納訪問封閉變量的lambda主體吆倦;

3、禁用坐求、棄用偏向鎖

4蚕泽、文本塊(正式版)

自Java13引入了文本塊 解決多行的問題,Java14 優(yōu)化 增加\和\s的符號區(qū)分 在Java15中 對文本框改進如下

  1. stripIndent()用于從文本塊去除空白字符
  2. translateEscapes() 用于翻譯轉義字符
  3. formatted()用于格式化

5、ZGC正式

  • ZGC是Java 11引入的新的垃圾收集器(JDK9以后默認的垃圾回收器是G1)须妻,經過了多個實驗階段仔蝌,自此終于成為正式特性。
  • 自 2018 年以來荒吏,ZGC 已增加了許多改進敛惊,從并發(fā)類卸載、取消使用未使用的內存绰更、對類數據共享的支持到改進的 NUMA 感知瞧挤。此外,最大堆大小從 4 TB 增加到 16 TB儡湾。支持的平臺包括 Linux特恬、Windows 和 MacOS。
  • ZGC是一個重新設計的并發(fā)的垃圾回收器徐钠,通過減少 GC 停頓時間來提高性能癌刽。
  • 默認的GC仍然還是G1;之前需要通過-XX:+UnlockExperimentalVMOptions -XX:+UseZGC來啟用ZGC尝丐,現在只需要-XX:+UseZGC就可以显拜。

6、Shenandoah GC正式

一種低停頓的垃圾回收器爹袁,-XX:+UseShenandoahGC 開啟 不需要添加參數 -XX:+UnlockExperimentalVMOptions

7远荠、外部存儲器訪問 API(二次孵化)

Foreign-Memory Access API在JDK14被作為incubating API引入,在JDK15處于Second Incubator呢簸,提供了改進矮台。

8乏屯、重新實現 DatagramSocket API

JEP 373:Reimplement the Legacy DatagramSocket API(重新實現 DatagramSocket API)

新的計劃是JEP 353的后續(xù)根时,該方案重新實現了遺留的套接字API。

更改java.net.DatagramSocket 和 java.net.MulticastSocket 為更加簡單辰晕、現代化的底層實現蛤迎。提高了 JDK 的可維護性和穩(wěn)定性。

通過將java.net.datagram.Socket和java.net.MulticastSocket API的底層實現替換為更簡單含友、更現代的實現來重新實現遺留的DatagramSocket API替裆。

9、移除廢棄

1窘问、移除Solaris 和 SPARC 端口

刪除對Solaris/SPARC辆童、Solaris/x64和Linux/SPARC端口的源代碼和構建支持,在JDK 14中被標記為廢棄惠赫,在JDK15版本正式移除把鉴。

2、移除the Nashorn JS引擎

Nashorn是在JDK提出的腳本執(zhí)行引擎愁拭,該功能是 2014 年 3 月發(fā)布的 JDK 8 的新特性碍遍。在JDK11就已經把它標記為廢棄了,JDK15完全移除揍堰。

在JDK11中取以代之的是GraalVM怠缸。GraalVM是一個運行時平臺诗轻,它支持Java和其他基于Java字節(jié)碼的語言,但也支持其他語言揭北,如JavaScript扳炬,Ruby,Python或LLVM搔体。性能是Nashorn的2倍以上鞠柄。

JDK15移除了Nashorn JavaScript Engine及jjs 命令行工具。具體就是jdk.scripting.nashorn及jdk.scripting.nashorn.shell這兩個模塊被移除了嫉柴。

Java16新特性

1厌杜、JEP 338: Vector API (孵化階段)

提供了jdk.incubator.vector來用于矢量計算,實例如下

static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;

void vectorComputation(float[] a, float[] b, float[] c) {

    for (int i = 0; i < a.length; i += SPECIES.length()) {
        var m = SPECIES.indexInRange(i, a.length);
        // FloatVector va, vb, vc;
        var va = FloatVector.fromArray(SPECIES, a, i, m);
        var vb = FloatVector.fromArray(SPECIES, b, i, m);
        var vc = va.mul(va).
                    add(vb.mul(vb)).
                    neg();
        vc.intoArray(c, i, m);
    }
}

2计螺、JEP 389: Foreign Linker API (孵化階段)

提供jdk.incubator.foreign來簡化native code的調用夯尽。

易用: 用一個純Java開發(fā)模型替換JNI.
支持C語言:
通用性:
高性能:

3、instanceof模式匹配登馒、Record匙握、jpackage打包工具開始正式使用

  1. instanceof的模式匹配在JDK14作為preview,在JDK15作為第二輪的preview陈轿,在JDK16轉正
  2. Record類型在JDK14作為preview圈纺,在JDK15處于第二輪preview,在JDK16轉正
  3. jpackage在JDK14引入麦射,JDK15作為incubating工具蛾娶,在JDK16轉正,從jdk.incubator.jpackage轉為jdk.jpackage潜秋。它支持Linux: deb and rpm蛔琅、macOS: pkg and dmg、Windows: msi and exe

4峻呛、ZGC優(yōu)化

實現了并發(fā)thread-stack處理來降低GC safepoints的負擔

5罗售、Elastic Metaspace

及時地將未使用的 HotSpot 類元數據(即元空間)內存返回給操作系統(tǒng),減少元空間占用钩述,并簡化元空間代碼以降低維護成本寨躁。

Java17新特性

1、Sealed 密封類轉正

sealed class 密封類允許描述哪個類或接口可以擴展或實現這個類或接口牙勘。簡而言之职恳,我們可以限制誰可以使用這個類或接口。

2、提供更好的偽隨機數生成

為偽隨機數生成器 (PRNG) 提供新的接口類型和實現话肖,包括可跳轉 PRNG 和另一類可拆分 PRNG 算法 (LXM)北秽。

引入了一個名為RandomGenerator的新接口。該接口的目標是為所有現有和新的PRNG提供統(tǒng)一的API最筒。

RandomGenerator提供名為ints贺氓、longs、doubles床蜘、nextBoolean辙培、nextInt、nextLong邢锯、nextDouble和nextFloat的方法扬蕊。

3、Switch模式匹配(預覽)

通過對 switch 表達式和語句的模式匹配以及對模式語言的擴展來增強 Java 編程語言丹擎。將模式匹配擴展到 switch 允許針對多個模式測試表達式尾抑,每個模式都有特定的操作,因此可以簡潔安全地表達復雜的面向數據的查詢蒂培。這是 JDK 17 中的預覽語言功能再愈。

static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}

4、用于特定于上下文的反序列化過濾器

5护戳、浮點運算更加嚴格

簡化數字敏感庫開發(fā)翎冲,包括java.lang.Math和java.lang.StrictMath

6、刪除一些功能

1媳荒、刪除實驗性 AOT 和 JIT 編譯器

2抗悍、刪除Applet API

3、棄用安全管理器Security Manager

棄用安全管理器以便在將來的版本中刪除钳枕。安全管理器可追溯到 Java 1.0缴渊。多年來,它一直不是保護客戶端 Java 代碼的主要方法么伯,也很少用于保護服務器端代碼疟暖。為了推動 Java 向前發(fā)展卡儒,我們打算棄用安全管理器田柔,以便與舊版 Applet API (JEP 398) 一起刪除。

4骨望、移除RMI激活機制

刪除遠程方法調用 (RMI) 激活機制硬爆,同時保留 RMI 的其余部分。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末擎鸠,一起剝皮案震驚了整個濱河市缀磕,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖袜蚕,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糟把,死亡現場離奇詭異,居然都是意外死亡牲剃,警方通過查閱死者的電腦和手機遣疯,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凿傅,“玉大人缠犀,你說我怎么就攤上這事〈鲜妫” “怎么了辨液?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箱残。 經常有香客問我滔迈,道長,這世上最難降的妖魔是什么被辑? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任亡鼠,我火速辦了婚禮,結果婚禮上敷待,老公的妹妹穿的比我還像新娘间涵。我一直安慰自己,他們只是感情好榜揖,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布勾哩。 她就那樣靜靜地躺著,像睡著了一般举哟。 火紅的嫁衣襯著肌膚如雪思劳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天妨猩,我揣著相機與錄音潜叛,去河邊找鬼。 笑死壶硅,一個胖子當著我的面吹牛威兜,可吹牛的內容都是我干的。 我是一名探鬼主播庐椒,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼椒舵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了约谈?” 一聲冷哼從身側響起笔宿,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤犁钟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泼橘,有當地人在樹林里發(fā)現了一具尸體涝动,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年炬灭,在試婚紗的時候發(fā)現自己被綠了捧存。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡担败,死狀恐怖昔穴,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情提前,我是刑警寧澤吗货,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站狈网,受9級特大地震影響宙搬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜拓哺,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一勇垛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧士鸥,春花似錦闲孤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脚仔,卻和暖如春勤众,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鲤脏。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工们颜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猎醇。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓窥突,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姑食。 傳聞我的和親對象是個殘疾皇子波岛,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容