java12比java11多了什么新特性,请逐条例举代码说明
时间: 2024-02-27 10:54:31 浏览: 118
Java 11 and 12 – New Features
好的,我会逐条列举 Java 12 相对于 Java 11 新增的一些特性,并给出相应的代码示例:
1. Switch 表达式
Java 12 引入了一种新的 Switch 表达式,可以使用 Lambda 样式的语法来编写 Switch 语句。
```
String day = "MONDAY";
int dayNumber = switch (day) {
case "MONDAY" -> 1;
case "TUESDAY" -> 2;
case "WEDNESDAY" -> 3;
case "THURSDAY" -> 4;
case "FRIDAY" -> 5;
case "SATURDAY" -> 6;
case "SUNDAY" -> 7;
default -> throw new IllegalArgumentException("Invalid day of the week: " + day);
};
System.out.println(dayNumber); // 输出 1
```
2. 紧凑型 Number 格式化
Java 12 提供了一个紧凑型的 Number 格式化程序,可以将数字格式化为紧凑型字符串。
```
long number = 1000000000L;
String compactNumber = NumberFormat.getCompactNumberInstance().format(number);
System.out.println(compactNumber); // 输出 1B
```
3. 安全的比较
Java 12 通过引入一个新的 API 来提供安全的对象比较方法。
```
Person p1 = new Person("Alice", 25);
Person p2 = new Person("Bob", 30);
Person p3 = new Person("Bob", 30);
// 使用 Objects.equals 方法进行比较
System.out.println(Objects.equals(p1, p2)); // 输出 false
System.out.println(Objects.equals(p2, p3)); // 输出 true
```
4. 新的垃圾收集器
Java 12 引入了一种新的垃圾收集器,名为 ZGC,可以为大型系统提供强大的性能。
```
// 设置使用 ZGC 垃圾收集器
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC Main
```
5. 默认的 CDS 归档
Java 12 提供了一种默认的 CDS 归档格式,可以通过将应用程序的类和库存档来加速启动时间。
```
// 创建默认的 CDS 归档文件
java -Xshare:dump
// 使用默认的 CDS 归档文件
java -Xshare:on Main
```
6. 增强的 CompletableFuture API
Java 12 提供了一组新的 API,以便更轻松地使用 CompletableFuture。
```
CompletableFuture.supplyAsync(() -> 42)
.thenApplyAsync(x -> x * 2)
.thenAcceptAsync(System.out::println)
.join(); // 输出 84
```
7. 改进的字符串 API
Java 12 提供了一些新的字符串 API,使得处理字符串更加容易。
```
String original = "Hello, World!";
String result = original.transform(s -> s.toUpperCase());
System.out.println(result); // 输出 HELLO, WORLD!
```
8. 改进的 Socket API
Java 12 提供了一些新的 Socket API,包括异步 Socket 及其相关的通道。
```
AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress("localhost", 8080));
serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {
@Override
public void completed(AsynchronousSocketChannel socketChannel, Void attachment) {
// 处理 Socket 连接
}
@Override
public void failed(Throwable exc, Void attachment) {
// 处理异常情况
}
});
```
阅读全文