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中 對文本框改進如下
- stripIndent()用于從文本塊去除空白字符
- translateEscapes() 用于翻譯轉義字符
- 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打包工具開始正式使用
- instanceof的模式匹配在JDK14作為preview,在JDK15作為第二輪的preview陈轿,在JDK16轉正
- Record類型在JDK14作為preview圈纺,在JDK15處于第二輪preview,在JDK16轉正
- 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 的其余部分。