最后,JDK 12是六个月的发布周期的一部分,它在最后的Java LTS版本11之后出现了,我们之前已经深入讨论了Java 11功能(/community/tutorials/java-11-features)。
Java 12 功能
Java 12 的一些重要功能是:
- JVM 更改 - JEP 189, JEP 346, JEP 344 和 JEP 230.
- 交换表达式
- 文件错误匹配() 方法
- 紧凑号码格式
- 在流程 API 中收集 Teeing 收集器6. Java 字符串新方法 - indent(), 转换(), 描述Constable(), 并解决ConstantDesc().
- JEP 334: JVM 常数 API
- JEP 305: 模型匹配 instanceof
- 原始字符串从 JDK 12.
让我们看看所有这些Java 12功能一个接一个。
JVM 变化
JEP189 - Shenandoah:一个低休息时间垃圾收集器(实验)
RedHat 启动了 Shenandoah Garbage Collector 以减少 GC 停机时间。 这个想法是与运行 Java 线程同时运行 GC。 它旨在实现一致且可预测的短暂停机,而不论堆积大小如何。
JEP 346 - 立即从 G1 返回未使用的承诺记忆
设置 Java 12 时,G1 将检查应用程序不活跃时的 Java Heap 内存,并将其返回操作系统,这是保护和使用自由内存的预防措施。
3. JEP 344 : 可取消的混合集合 G1
G1 效率的改进包括使 G1 混合集合如果可能超出定义的停留目标,则可以放弃。
JEP 230 和 344
Microbenchmark Suite,JEP 230功能为JDK源代码添加了一套基本的microbenchmarks。这使得开发人员可以轻松地运行现有的microbenchmarks并创建新的microbenchmarks。 One AArch64 Port, Not Two,JEP 344,删除与arm64端口相关的所有源,同时保持32位ARM端口和64位aarch64端口。
JEP 341 默认 CDS 档案
这增强了 JDK 构建过程,以在 64 位平台上使用默认类列表生成类数据共享 (CDS) 档案. 目标是改善启动时间. 从 Java 12 开始,CDS 默认启动。
1java -Xshare:off HelloWorld.java
现在,这将延迟项目的启动时间。
语言变化与特点
Java 12 引入了许多语言功能,让我们看看一些实现。
1. 交换表达式(预览)
Java 12 为模式匹配提供了改进的Switch表达式。在JEP 325(https://openjdk.java.net/jeps/325)中引入,作为预览语言功能,新语法为L ->
。
- 新 Syntax 消除了需要打破声明以防止突破
- 交换式表达式不再通过
- 此外,我们可以定义相同标签中的多个常数
- 在交换式表达式中
默认
案例现在是强制性的 - 在交换式表达式中
打破
用于返回一个案例本身的值。
经典的Switch声明:
1String result = "";
2 switch (day) {
3 case "M":
4 case "W":
5 case "F": {
6 result = "MWF";
7 break;
8 }
9 case "T":
10 case "TH":
11 case "S": {
12 result = "TTS";
13 break;
14 }
15 };
16
17 System.out.println("Old Switch Result:");
18 System.out.println(result);
有了新的 Switch 表达式,我们不需要在任何地方设置间歇,从而防止逻辑错误!
1String result = switch (day) {
2 case "M", "W", "F" -> "MWF";
3 case "T", "TH", "S" -> "TTS";
4 default -> {
5 if(day.isEmpty())
6 break "Please insert a valid day.";
7 else
8 break "Looks like a Sunday.";
9 }
10
11 };
12
13 System.out.println(result);
让我们运行下面的程序,其中包含使用 JDK 12 的新交换表达式。
1public class SwitchExpressions {
2
3 public static void main(String[] args)
4 {
5 System.out.println("New Switch Expression result:");
6 executeNewSwitchExpression("M");
7 executeNewSwitchExpression("TH");
8 executeNewSwitchExpression("");
9 executeNewSwitchExpression("SUN");
10 }
11
12 public static void executeNewSwitchExpression(String day){
13
14 String result = switch (day) {
15 case "M", "W", "F" -> "MWF";
16 case "T", "TH", "S" -> "TTS";
17 default -> {
18 if(day.isEmpty())
19 break "Please insert a valid day.";
20 else
21 break "Looks like a Sunday.";
22 }
23
24 };
25
26 System.out.println(result);
27 }
28}
由于这是预览功能,请确保您选择了语言水平作为Java 12预览。
1javac -Xlint:preview --enable-preview -source 12 src/main/java/SwitchExpressions.java
运行编译程序后,我们在控制台中获得以下内容
交换表达式是一个 **预览语言功能,这意味着即使它是完整的,它可能不会在未来的Java版本中得到确认。
二、File.mismatch的方法
Java 12 添加了以下方法来比较两个文件:
1public static long mismatch(Path path, Path path2) throws IOException
此方法返回第一个错误匹配的位置或 -1L,如果没有错误匹配,两个文件可以在以下情况下出现错误匹配:
- 如果字节不相同,则返回第一个不匹配字节的位置
- 文件大小不相同,则返回较小的文件的大小
IntelliJ Idea 的示例代码片段如下:
1import java.io.IOException;
2import java.nio.file.Files;
3import java.nio.file.Path;
4
5public class FileMismatchExample {
6
7 public static void main(String[] args) throws IOException {
8 Path filePath1 = Files.createTempFile("file1", ".txt");
9 Path filePath2 = Files.createTempFile("file2", ".txt");
10 Files.writeString(filePath1,"JournalDev Test String");
11 Files.writeString(filePath2,"JournalDev Test String");
12
13 long mismatch = Files.mismatch(filePath1, filePath2);
14
15 System.out.println("File Mismatch position... It returns -1 if there is no mismatch");
16
17 System.out.println("Mismatch position in file1 and file2 is >>>>");
18 System.out.println(mismatch);
19
20 filePath1.toFile().deleteOnExit();
21 filePath2.toFile().deleteOnExit();
22
23 System.out.println();
24
25 Path filePath3 = Files.createTempFile("file3", ".txt");
26 Path filePath4 = Files.createTempFile("file4", ".txt");
27 Files.writeString(filePath3,"JournalDev Test String");
28 Files.writeString(filePath4,"JournalDev.com Test String");
29
30 long mismatch2 = Files.mismatch(filePath3, filePath4);
31
32 System.out.println("Mismatch position in file3 and file4 is >>>>");
33 System.out.println(mismatch2);
34
35 filePath3.toFile().deleteOnExit();
36 filePath4.toFile().deleteOnExit();
37
38 }
39
40}
上述 Java 程序编译和运行时的输出是:
3、数组格式化
1import java.text.NumberFormat;
2import java.util.Locale;
3
4public class CompactNumberFormatting {
5
6 public static void main(String[] args)
7 {
8 System.out.println("Compact Formatting is:");
9 NumberFormat upvotes = NumberFormat
10 .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
11 upvotes.setMaximumFractionDigits(1);
12
13 System.out.println(upvotes.format(2592) + " upvotes");
14
15 NumberFormat upvotes2 = NumberFormat
16 .getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
17 upvotes2.setMaximumFractionDigits(2);
18 System.out.println(upvotes2.format(2011) + " upvotes");
19 }
20
21}
四、收藏家
Teeing Collector 是 Streams API 中引入的新收集器实用程序. 这个收集器有三个参数 - 两个收集器和一个 Bi 函数. 所有输入值都传递给每个收集器,结果在 Bi 函数中可用。
1double mean = Stream.of(1, 2, 3, 4, 5)
2 .collect(Collectors.teeing(
3 summingDouble(i -> i),
4 counting(),
5 (sum, n) -> sum / n));
6
7System.out.println(mean);
输出是 3.0。
Java Strings 新方法
Java 12 中引入了 4 种新方法:
- inent(int n)
- 转换(函数 f)
- 可选描述Constable()
- String resolveConstantDesc (MethodHandles.Lookup lookup)
要详细了解上述方法,并在其中实施,请参阅我们的 Java 12 字符串方法( / 社区 / 教程 / Java-12 字符串方法)教程。
JEP 334: JVM 常态 API
一个新的包java.lang.constant
被引入这个 JEP. 这对那些不使用常数集的开发者来说并不那么有用。
JEP 305:模型匹配为例(预览)
另一个预览语言功能! 将一个类型输入到另一个类型的旧方法是:
1if (obj instanceof String) {
2 String s = (String) obj;
3 // use s in your code from here
4}
新方法是:
1if (obj instanceof String s) {
2 // can use s directly here
3}
这节省了我们一些不必要的打字。
Raw String Literals 已从 JDK 12 中删除。
这就结束了这篇关于Java 12的文章。