mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
Update 一文带你看遍JDK9到14的重要新特性.md
This commit is contained in:
parent
e4bb8f845f
commit
c1b2be016d
@ -415,43 +415,133 @@ Consumer<String> consumer = (String i) -> System.out.println(i);
|
||||
|
||||
## Java12
|
||||
|
||||
### 增强 Switch
|
||||
### String
|
||||
|
||||
- 传统的 switch 语法存在容易漏写 break 的问题,而且从代码整洁性层面来看,多个 break 本质也是一种重复
|
||||
Java 11 增加了两个的字符串处理方法,如以下所示。
|
||||
|
||||
- Java12 提供了 swtich 表达式,使用类似 lambda 语法条件匹配成功后的执行块,不需要多写 break
|
||||
`indent()` 方法可以实现字符串缩进。
|
||||
|
||||
- 作为预览特性加入,需要在`javac`编译和`java`运行时增加参数`--enable-preview`
|
||||
```java
|
||||
String text = "Java";
|
||||
// 缩进 4 格
|
||||
text = text.indent(4);
|
||||
System.out.println(text);
|
||||
text = text.indent(-10);
|
||||
System.out.println(text);
|
||||
```
|
||||
|
||||
```java
|
||||
switch (day) {
|
||||
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
|
||||
case TUESDAY -> System.out.println(7);
|
||||
case THURSDAY, SATURDAY -> System.out.println(8);
|
||||
case WEDNESDAY -> System.out.println(9);
|
||||
}
|
||||
```
|
||||
输出:
|
||||
|
||||
```
|
||||
Java
|
||||
Java
|
||||
```
|
||||
|
||||
`transform()` 方法可以用来转变指定字符串。
|
||||
|
||||
```java
|
||||
String result = "foo".transform(input -> input + " bar");
|
||||
System.out.println(result); // foo bar
|
||||
```
|
||||
|
||||
### 文件比较
|
||||
|
||||
Java 12 添加了以下方法来比较两个文件:
|
||||
|
||||
```java
|
||||
public static long mismatch(Path path, Path path2) throws IOException
|
||||
```
|
||||
|
||||
`mismatch()` 方法用于比较两个文件,并返回第一个不匹配字符的位置,如果文件相同则返回 -1L。
|
||||
|
||||
代码示例(两个文件内容相同的情况):
|
||||
|
||||
```java
|
||||
Path filePath1 = Files.createTempFile("file1", ".txt");
|
||||
Path filePath2 = Files.createTempFile("file2", ".txt");
|
||||
Files.writeString(filePath1, "Java 12 Article");
|
||||
Files.writeString(filePath2, "Java 12 Article");
|
||||
|
||||
long mismatch = Files.mismatch(filePath1, filePath2);
|
||||
assertEquals(-1, mismatch);
|
||||
```
|
||||
|
||||
代码示例(两个文件内容不相同的情况):
|
||||
|
||||
```java
|
||||
Path filePath3 = Files.createTempFile("file3", ".txt");
|
||||
Path filePath4 = Files.createTempFile("file4", ".txt");
|
||||
Files.writeString(filePath3, "Java 12 Article");
|
||||
Files.writeString(filePath4, "Java 12 Tutorial");
|
||||
|
||||
long mismatch = Files.mismatch(filePath3, filePath4);
|
||||
assertEquals(8, mismatch);
|
||||
```
|
||||
|
||||
### 数字格式化工具类
|
||||
|
||||
- `NumberFormat` 新增了对复杂的数字进行格式化的支持
|
||||
`NumberFormat` 新增了对复杂的数字进行格式化的支持
|
||||
|
||||
```java
|
||||
NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
|
||||
String result = fmt.format(1000);
|
||||
System.out.println(result); // 输出为 1K,计算工资是多少K更方便了。。。
|
||||
```
|
||||
```java
|
||||
NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
|
||||
String result = fmt.format(1000);
|
||||
System.out.println(result); // 输出为 1K,计算工资是多少K更方便了。。。
|
||||
```
|
||||
|
||||
### Shenandoah GC
|
||||
|
||||
- Redhat 主导开发的 Pauseless GC 实现,主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等
|
||||
- 和 Java11 开源的 ZGC 相比(需要升级到 JDK11 才能使用),Shenandoah GC 有稳定的 JDK8u 版本,在 Java8 占据主要市场份额的今天有更大的可落地性
|
||||
Redhat 主导开发的 Pauseless GC 实现,主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等
|
||||
|
||||
和 Java11 开源的 ZGC 相比(需要升级到 JDK11 才能使用),Shenandoah GC 有稳定的 JDK8u 版本,在 Java8 占据主要市场份额的今天有更大的可落地性。
|
||||
|
||||
### G1 收集器提升
|
||||
|
||||
- **Java12 为默认的垃圾收集器 G1 带来了两项更新:**
|
||||
- 可中止的混合收集集合:JEP344 的实现,为了达到用户提供的停顿时间目标,JEP 344 通过把要被回收的区域集(混合收集集合)拆分为强制和可选部分,使 G1 垃圾回收器能中止垃圾回收过程。 G1 可以中止可选部分的回收以达到停顿时间目标
|
||||
- 及时返回未使用的已分配内存:JEP346 的实现,增强 G1 GC,以便在空闲时自动将 Java 堆内存返回给操作系统
|
||||
Java12 为默认的垃圾收集器 G1 带来了两项更新:
|
||||
|
||||
- **可中止的混合收集集合** :JEP344 的实现,为了达到用户提供的停顿时间目标,JEP 344 通过把要被回收的区域集(混合收集集合)拆分为强制和可选部分,使 G1 垃圾回收器能中止垃圾回收过程。 G1 可以中止可选部分的回收以达到停顿时间目标
|
||||
- **及时返回未使用的已分配内存** :JEP346 的实现,增强 G1 GC,以便在空闲时自动将 Java 堆内存返回给操作系统
|
||||
|
||||
### 预览新特性
|
||||
|
||||
作为预览特性加入,需要在`javac`编译和`java`运行时增加参数`--enable-preview` 。
|
||||
|
||||
#### 增强 Switch
|
||||
|
||||
传统的 `switch` 语法存在容易漏写 `break` 的问题,而且从代码整洁性层面来看,多个 break 本质也是一种重复
|
||||
|
||||
Java12 提供了 `swtich` 表达式,使用类似 lambda 语法条件匹配成功后的执行块,不需要多写 break 。
|
||||
|
||||
```java
|
||||
switch (day) {
|
||||
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
|
||||
case TUESDAY -> System.out.println(7);
|
||||
case THURSDAY, SATURDAY -> System.out.println(8);
|
||||
case WEDNESDAY -> System.out.println(9);
|
||||
}
|
||||
```
|
||||
|
||||
#### instanceof 模式匹配
|
||||
|
||||
`instanceof` 主要在**类型强转前探测对象的具体类型**。
|
||||
|
||||
之前的版本中,我们需要显示地对对象进行类型转换。
|
||||
|
||||
```java
|
||||
Object obj = "我是字符串";
|
||||
if(obj instanceof String){
|
||||
String str = (String) obj;
|
||||
System.out.println(str);
|
||||
}
|
||||
```
|
||||
|
||||
新版的 `instanceof` 可以在判断是否属于具体的类型同时完成转换。
|
||||
|
||||
```java
|
||||
Object obj = "我是字符串";
|
||||
if(obj instanceof String str){
|
||||
System.out.println(str);
|
||||
}
|
||||
```
|
||||
|
||||
## Java13
|
||||
|
||||
@ -599,16 +689,7 @@ switch (day) {
|
||||
|
||||
### instanceof 增强
|
||||
|
||||
- instanceof 主要在**类型强转前探测对象的具体类型**,然后执行具体的强转
|
||||
|
||||
- 新版的 instanceof 可以在判断的是否属于具体的类型同时完成转换
|
||||
|
||||
```java
|
||||
Object obj = "我是字符串";
|
||||
if(obj instanceof String str){
|
||||
System.out.println(str);
|
||||
}
|
||||
```
|
||||
依然是**预览特性** ,Java 12 新特性中介绍过。
|
||||
|
||||
### 其他特性
|
||||
|
||||
@ -640,6 +721,7 @@ if(obj instanceof String str){
|
||||
- Java 11 – Features and Comparison: <https://www.geeksforgeeks.org/java-11-features-and-comparison/>
|
||||
- Oracle Java12 ReleaseNote <https://www.oracle.com/technetwork/java/javase/12all-relnotes-5211423.html#NewFeature>
|
||||
- Oracle Java13 ReleaseNote <https://www.oracle.com/technetwork/java/javase/13all-relnotes-5461743.html#NewFeature>
|
||||
- New Features in Java 12 <https://www.baeldung.com/java-12-new-features>
|
||||
- New Java13 Features <https://www.baeldung.com/java-13-new-features>
|
||||
- Java13 新特性概述 <https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-13/index.html>
|
||||
- Oracle Java14 record <https://docs.oracle.com/en/java/javase/14/language/records.html>
|
||||
|
Loading…
x
Reference in New Issue
Block a user