跳转至

Java 12 有哪些新特性?

结论

Java 12(2018 年 3 月发布)是第一个 LTS 之外的非短期支持版本,重点在语法糖、JVM 性能与 GC。其中最常用的是 switch 表达式(预览)

1. Switch 表达式(预览,JEP 325)

传统 switch 容易漏 break,Java 12 引入箭头语法和 yield

// 传统
int numDays;
switch (month) {
    case 1: case 3: case 5:
    case 7: case 8: case 10: case 12:
        numDays = 31; break;
    case 2:
        numDays = 28; break;
    default:
        numDays = 0;
}

// Java 12 switch 表达式
int numDays = switch (month) {
    case 1, 3, 5, 7, 8, 10, 12 -> 31;
    case 2 -> 28;
    default -> {
        int leap = ...;
        yield 28 + leap;   // 用 yield 返回值
    }
};

特点: - -> 箭头形式不需要 break,不会贯穿。 - switch 可以作为表达式直接返回值。 - 多 case 用逗号分隔。

2. Shenandoah GC(JEP 189)

低停顿垃圾回收器,与 G1 类似,但把并发整理阶段也并发执行,停顿时间与堆大小无关。OpenJDK 12 中 GA。

3. G1 收集器增强

  • 可中断的 mixed GC(JEP 230):让 mixed GC 的停顿更可控。

4. Microbenchmark Suite(JEP 230)

JDK 源码自带一套 Java 微基准测试。

5. One Step ASC / ISO-... (弃用与移除)

  • 移除 com.sun.awt.AWTUtilities
  • 移除 sun.misc.Unsafe#defineAnonymousClass
  • 弃用 Security Manager(在更高版本)

6. Files.mismatch(JDK 12 API)

// 比较两个文件内容是否相同,返回第一个不匹配的字节位置
long mismatch = Files.mismatch(path1, path2);

7. String 新方法

"hello".indent(4);          // 缩进
"  hi  ".transform(s -> s.trim().toUpperCase());  // 函数式转换

8. Compact Number Format

NumberFormat fmt = NumberFormat.getCompactNumberInstance(
    Locale.US, NumberFormat.Style.SHORT);
fmt.format(1000);   // "1K"

版本脉络

  • Java 8:Lambda、Stream、Optional、新日期 API。
  • Java 9:模块化、JShell、集合工厂方法。
  • Java 11:LTS,var、HTTP Client。
  • Java 17:LTS,switch 表达式转正、pattern matching(预览)、sealed class。
  • Java 21:LTS,虚拟线程、pattern matching 转正。