Skip to content

Commit 1bfc5c1

Browse files
committed
[feat]Java 15 新特性总结
1 parent 22a16d6 commit 1bfc5c1

File tree

3 files changed

+230
-72
lines changed

3 files changed

+230
-72
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
9393
### 新特性
9494

9595
1. **Java 8**[Java 8 新特性总结](docs/java/new-features/Java8新特性总结.md)[Java8常用新特性总结](docs/java/new-features/java8-common-new-features.md)[Java 8 学习资源推荐](docs/java/new-features/Java8教程推荐.md)[Java8 forEach 指南](docs/java/new-features/Java8foreach指南.md)
96-
2. **Java9~Java14** : [一文带你看遍 JDK9~14 的重要新特性!](./docs/java/new-features/一文带你看遍JDK9到14的重要新特性.md)
96+
2. **Java9~Java15** : [一文带你看遍 JDK9~15 的重要新特性!](./docs/java/new-features/java新特性总结.md)
9797

9898
## 计算机基础
9999

Lines changed: 164 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ var op = Optional.empty();
336336
System.out.println(op.isEmpty());//判断指定的 Optional 对象是否为空
337337
```
338338

339-
### ZGC可伸缩低延迟垃圾收集器
339+
### ZGC(可伸缩低延迟垃圾收集器)
340340

341341
**ZGC 即 Z Garbage Collector**,是一个可伸缩的、低延迟的垃圾收集器。
342342

@@ -549,6 +549,46 @@ if(obj instanceof String str){
549549

550550
## Java13
551551

552+
### 增强 ZGC(释放未使用内存)
553+
554+
在 Java 11 中是实验性的引入的 ZGC 在实际的使用中存在未能主动将未使用的内存释放给操作系统的问题。
555+
556+
ZGC 堆由一组称为 ZPages 的堆区域组成。在 GC 周期中清空 ZPages 区域时,它们将被释放并返回到页面缓存 **ZPageCache** 中,此缓存中的 ZPages 按最近最少使用(LRU)的顺序,并按照大小进行组织。
557+
558+
在 Java 13 中,ZGC 将向操作系统返回被标识为长时间未使用的页面,这样它们将可以被其他进程重用。
559+
560+
### SocketAPI 重构
561+
562+
Java Socket API 终于迎来了重大更新!
563+
564+
Java 13 将 Socket API 的底层进行了重写, `NioSocketImpl` 是对 `PlainSocketImpl` 的直接替代,它使用 `java.util.concurrent` 包下的锁而不是同步方法。如果要使用旧实现,请使用 `-Djdk.net.usePlainSocketImpl=true`
565+
566+
并且,在 Java 13 中是默认使用新的 Socket 实现。
567+
568+
```java
569+
public final class NioSocketImpl extends SocketImpl implements PlatformSocketImpl {
570+
}
571+
```
572+
573+
### FileSystems
574+
575+
`FileSystems` 类中添加了以下三种新方法,以便更容易地使用将文件内容视为文件系统的文件系统提供程序:
576+
577+
- `newFileSystem(Path)`
578+
- `newFileSystem(Path, Map<String, ?>)`
579+
- `newFileSystem(Path, Map<String, ?>, ClassLoader)`
580+
581+
### 动态 CDS 存档
582+
583+
Java 13 中对 Java 10 中引入的应用程序类数据共享(AppCDS)进行了进一步的简化、改进和扩展,即:**允许在 Java 应用程序执行结束时动态进行类归档**,具体能够被归档的类包括所有已被加载,但不属于默认基层 CDS 的应用程序类和引用类库中的类。
584+
585+
这提高了应用程序类数据共享([AppCDS](https://openjdk.java.net/jeps/310))的可用性。无需用户进行试运行来为每个应用程序创建类列表。
586+
587+
```bash
588+
$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar
589+
$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar
590+
```
591+
552592
### 预览新特性
553593

554594
#### 文本块
@@ -569,7 +609,6 @@ String json ="{\n" +
569609
支持文本块之后的 HTML 写法:
570610

571611
```java
572-
573612
String json = """
574613
{
575614
"name":"mkyong",
@@ -633,46 +672,6 @@ public String translateEscapes() {
633672
}
634673
```
635674

636-
### 增强 ZGC(释放未使用内存)
637-
638-
在 Java 11 中是实验性的引入的 ZGC 在实际的使用中存在未能主动将未使用的内存释放给操作系统的问题。
639-
640-
ZGC 堆由一组称为 ZPages 的堆区域组成。在 GC 周期中清空 ZPages 区域时,它们将被释放并返回到页面缓存 **ZPageCache** 中,此缓存中的 ZPages 按最近最少使用(LRU)的顺序,并按照大小进行组织。
641-
642-
在 Java 13 中,ZGC 将向操作系统返回被标识为长时间未使用的页面,这样它们将可以被其他进程重用。
643-
644-
### SocketAPI 重构
645-
646-
Java Socket API 终于迎来了重大更新!
647-
648-
Java 13 将 Socket API 的底层进行了重写, `NioSocketImpl` 是对 `PlainSocketImpl` 的直接替代,它使用 `java.util.concurrent` 包下的锁而不是同步方法。如果要使用旧实现,请使用 `-Djdk.net.usePlainSocketImpl=true`
649-
650-
并且,在 Java 13 中是默认使用新的 Socket 实现,使其易于发现并在排除问题同时增加可维护性
651-
652-
```java
653-
public final class NioSocketImpl extends SocketImpl implements PlatformSocketImpl {
654-
}
655-
```
656-
657-
### FileSystems
658-
659-
`FileSystems` 类中添加了以下三种新方法,以便更容易地使用将文件内容视为文件系统的文件系统提供程序:
660-
661-
- `newFileSystem(Path)`
662-
- `newFileSystem(Path, Map<String, ?>)`
663-
- `newFileSystem(Path, Map<String, ?>, ClassLoader)`
664-
665-
### 动态 CDS 存档
666-
667-
Java 13 中对 Java 10 中引入的应用程序类数据共享(AppCDS)进行了进一步的简化、改进和扩展,即:**允许在 Java 应用程序执行结束时动态进行类归档**,具体能够被归档的类包括所有已被加载,但不属于默认基层 CDS 的应用程序类和引用类库中的类。
668-
669-
这提高了应用程序类数据共享([AppCDS](https://openjdk.java.net/jeps/310))的可用性。无需用户进行试运行来为每个应用程序创建类列表。
670-
671-
```bash
672-
$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar
673-
$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar
674-
```
675-
676675
## Java14
677676

678677
### 空指针异常精准提示
@@ -789,6 +788,127 @@ c++ php
789788
- 移除了 CMS(Concurrent Mark Sweep) 垃圾收集器(功成而退)
790789
- 新增了 jpackage 工具,标配将应用打成 jar 包外,还支持不同平台的特性包,比如 linux 下的`deb``rpm`,window 平台下的`msi``exe`
791790

791+
## Java15
792+
793+
### CharSequence
794+
795+
`CharSequence` 接口添加了一个默认方法 `isEmpty()` 来判断字符序列为空,如果是则返回 true。
796+
797+
```java
798+
public interface CharSequence {
799+
default boolean isEmpty() {
800+
return this.length() == 0;
801+
}
802+
}
803+
```
804+
805+
### TreeMap
806+
807+
`TreeMap` 新引入了下面这些方法:
808+
809+
- `putIfAbsent()`
810+
- `computeIfAbsent()`
811+
- `computeIfPresent()`
812+
- `compute()`
813+
- `merge()`
814+
815+
### ZGC(转正)
816+
817+
Java11 的时候 ,ZGC 还在试验阶段。
818+
819+
当时,ZGC 的出现让众多 Java 开发者看到了垃圾回收器的另外一种可能,因此备受关注。
820+
821+
经过多个版本的迭代,不断的完善和修复问题,ZGC 在 Java 15 已经可以正式使用了!
822+
823+
不过,默认的垃圾回收器依然是 G1。你可以通过下面的参数启动 ZGC:
824+
825+
```bash
826+
$ java -XX:+UseZGC className
827+
```
828+
829+
### EdDSA(数字签名算法)
830+
831+
新加入了一个安全性和性能都更强的基于 Edwards-Curve Digital Signature Algorithm (EdDSA)实现的数字签名算法。
832+
833+
虽然其性能优于现有的 ECDSA 实现,不过,它并不会完全取代 JDK 中现有的椭圆曲线数字签名算法( ECDSA)。
834+
835+
```java
836+
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
837+
KeyPair kp = kpg.generateKeyPair();
838+
839+
byte[] msg = "test_string".getBytes(StandardCharsets.UTF_8);
840+
841+
Signature sig = Signature.getInstance("Ed25519");
842+
sig.initSign(kp.getPrivate());
843+
sig.update(msg);
844+
byte[] s = sig.sign();
845+
846+
String encodedString = Base64.getEncoder().encodeToString(s);
847+
System.out.println(encodedString);
848+
```
849+
850+
输出:
851+
852+
```
853+
0Hc0lxxASZNvS52WsvnncJOH/mlFhnA8Tc6D/k5DtAX5BSsNVjtPF4R4+yMWXVjrvB2mxVXmChIbki6goFBgAg==
854+
```
855+
856+
### 文本块(转正)
857+
858+
在 Java 15 ,文本块是正式的功能特性了。
859+
860+
### 隐藏类(Hidden Classes)
861+
862+
隐藏类是为框架(frameworks)所设计的,隐藏类不能直接被其他类的字节码使用,只能在运行时生成类并通过反射间接使用它们。
863+
864+
### 预览新特性
865+
866+
#### record 关键字
867+
868+
Java 15 对 Java 14 中引入的预览新特性进行了增强,主要是引入了一个新的概念 **密封类(Sealed Classes)。**
869+
870+
密封类可以对继承或者实现它们的类进行限制。
871+
872+
比如抽象类 `Person` 只允许 `Employee``Manager` 继承。
873+
874+
```java
875+
public abstract sealed class Person
876+
permits Employee, Manager {
877+
878+
//...
879+
}
880+
```
881+
882+
另外,任何扩展密封类的类本身都必须声明为 `sealed``non-sealed``final`
883+
884+
```java
885+
public final class Employee extends Person {
886+
}
887+
888+
public non-sealed class Manager extends Person {
889+
}
890+
```
891+
892+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/image-20210820153955587.png)
893+
894+
`java.lang.Class` 增加了两个公共方法用于获取 `Record` 类信息:
895+
896+
1. `RecordComponent[] getRecordComponents()`
897+
2. `boolean isRecord()`
898+
899+
#### instanceof 模式匹配
900+
901+
Java 15 并没有对此特性进行调整,继续预览特性,主要用于接受更多的使用反馈。
902+
903+
在未来的 Java 版本中,Java 的目标是继续完善 `instanceof` 模式匹配新特性。
904+
905+
### Java15 其他新特性
906+
907+
- **Nashorn JavaScript 引擎彻底移除** :Nashorn 从 Java8 开始引入的 JavaScript 引擎,Java9 对 Nashorn 做了些增强,实现了一些 ES6 的新特性。在 Java 11 中就已经被弃用,到了 Java 15 就彻底被删除了。
908+
- **DatagramSocket API 重构**
909+
- **禁用和废弃偏向锁(Biased Locking)** : 偏向锁的引入增加了 JVM 的复杂性大于其带来的性能提升。不过,你仍然可以使用 `-XX:+UseBiasedLocking` 启用偏向锁定,但它会提示 这是一个已弃用的 API。
910+
- ......
911+
792912
## 总结
793913

794914
### 关于预览特性
@@ -824,4 +944,5 @@ c++ php
824944
- Java13 新特性概述 <https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-13/index.html>
825945
- Oracle Java14 record <https://docs.oracle.com/en/java/javase/14/language/records.html>
826946
- java14-features <https://www.techgeeknext.com/java/java14-features>
827-
- Java 14 Features : <https://www.journaldev.com/37273/java-14-features>
947+
- Java 14 Features : <https://www.journaldev.com/37273/java-14-features>
948+
- What is new in Java 15: https://mkyong.com/java/what-is-new-in-java-15/

0 commit comments

Comments
 (0)