Java 12 的新特性
1.增强的Switch表达式
JDK 12扩展了switch语句的语法,使其不仅可以用作语句,还可以用作表达式。这意味着switch现在可以直接返回值或赋值给变量,从而简化了代码并减少了编写额外代码的需要。这一特性在后续的JDK版本中得到了进一步的加强和稳定。
public class SwitchExpressionsDemo {
public static void main(String[] args) {
// 示例数据
String dayOfWeek = "MONDAY";
// 使用Switch Expressions来处理dayOfWeek
String result = switch (dayOfWeek) {
case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> "Weekday";
case "SATURDAY", "SUNDAY" -> "Weekend";
default -> "Invalid day";
};
// 输出结果
System.out.println(result);
// 另一个示例,演示带有多个语句的case
int number = 3;
String numberDescription = switch (number) {
case 1 -> "One";
case 2 -> "Two";
case 3, 4, 5 -> {
String description = "Number is between 3 and 5";
System.out.println("Evaluating case for numbers 3, 4, 5...");
yield description; // 使用yield来返回结果
}
default -> "Number is greater than 5";
};
// 输出number的描述
System.out.println(numberDescription);
}
}
2. 文件对比 Files.mismatch
Java 12 这次带来了文件对比功能。对比两个文件,如果内容一致,会返回 -1 ,如果内容不同,会返回不同的字节开始位置。
例子:
// 创建两个文件
Path pathA = Files.createFile(Paths.get("a.txt"));
Path pathB = Files.createFile(Paths.get("b.txt"));
// 写入相同内容
Files.write(pathA,"abc".getBytes(), StandardOpenOption.WRITE);
Files.write(pathB,"abc".getBytes(), StandardOpenOption.WRITE);
long mismatch = Files.mismatch(pathA, pathB);
System.out.println(mismatch);
3. JVM相关
Shenandoah 垃圾收集器:Java 12 增加了 Shenandoah 一个低停顿的垃圾收集器,Shenandoah是一个旨在减少垃圾收集(GC)暂停时间的实验性GC算法。它通过与正在运行的Java线程同时工作,来减少GC对应用性能的影响。Shenandoah的暂停时间与堆的大小无关,这意味着无论堆是200MB还是200GB,其暂停时间都将保持一致。
JVM常量API:JDK 12引入了JVM常量API,该API提供了一组基于值的符号引用类型,用于描述可以从常量池加载的常量。这些改进有助于开发者更好地理解和操作Java类文件中的常量池。
ZGC 并发类卸载:Z 垃圾收集器现在支持类卸载,通过卸载不使用的类来释放这些类相关的数据结构,从而减少应用程序的总体占用空间。因为是并发执行,所以不会停止 Java 应用程序线程的执行,也因此对 GC 的暂停时间影响微乎其微。默认情况下启用此功能,但可以使用命令行选项禁用 -XX:-ClassUnloading。
G1 GC的改进:JDK 12增强了G1垃圾收集器,使其能够在混合收集过程中如果可能超过暂停目标时间时暂停收集。这有助于避免长时间的GC暂停,提高应用的响应性。JDK 12还增强了G1 GC,以便在空闲时自动将Java堆内存返回给操作系统。这有助于减少云服务等场景下的资源占用和费用支出。
评论区