用心组装
96.25M · 2026-02-18
JDK 17(2021年9月发布)是Java的长期支持(LTS)版本,引入了多项重要特性和性能改进。作为继JDK 11之后的又一个LTS版本,JDK 17在保持兼容性的同时,提供了更现代、更安全、更高效的语言特性和API,为Java开发者带来了更好的开发体验和性能表现。
特性说明:
sealed关键字声明,配合permits子句指定允许的子类final、sealed或non-sealed语法格式:
// 密封接口
sealed interface 接口名 permits 实现类1, 实现类2, ... {
// 方法声明
}
// 密封类
sealed class 类名 permits 子类1, 子类2, ... {
// 类定义
}
// 最终子类
final class 子类名 extends 密封类 {
// 类定义
}
// 非密封子类(可被任意继承)
non-sealed class 子类名 extends 密封类 {
// 类定义
}
代码示例:
// 密封接口 - 只允许指定的类实现
sealed interface Shape permits Circle, Rectangle, Square {
String name();
}
// 密封类 - 只允许指定的类继承
sealed class AbstractShape permits Circle, Rectangle, Square {
private final String color;
public AbstractShape(String color) {
this.color = color;
}
public String getColor() {
return color;
}
}
// 最终类 - 不能再被继承
final class Circle extends AbstractShape implements Shape {
private final double radius;
public Circle(double radius) {
this(radius, "red");
}
public Circle(double radius, String color) {
super(color);
this.radius = radius;
}
public double radius() {
return radius;
}
@Override
public String name() {
return "Circle";
}
@Override
public String toString() {
return String.format("Circle(radius=%.2f, color=%s)", radius, getColor());
}
}
// 非密封类 - 可以被任意继承
non-sealed class Rectangle extends AbstractShape implements Shape {
private final double width;
private final double height;
public Rectangle(double width, double height) {
this(width, height, "blue");
}
public Rectangle(double width, double height, String color) {
super(color);
this.width = width;
this.height = height;
}
public double width() {
return width;
}
public double height() {
return height;
}
@Override
public String name() {
return "Rectangle";
}
@Override
public String toString() {
return String.format("Rectangle(width=%.2f, height=%.2f, color=%s)",
width, height, getColor());
}
}
// 最终类
final class Square extends AbstractShape implements Shape {
private final double side;
public Square(double side) {
this(side, "green");
}
public Square(double side, String color) {
super(color);
this.side = side;
}
public double side() {
return side;
}
@Override
public String name() {
return "Square";
}
@Override
public String toString() {
return String.format("Square(side=%.2f, color=%s)", side, getColor());
}
}
// 使用密封类
public static void demonstrateSealedClasses() {
System.out.println("=== 密封类示例 ===");
// 创建不同形状的实例
List<Shape> shapes = List.of(
new Circle(5.0),
new Rectangle(4.0, 6.0),
new Square(3.0)
);
// 处理形状
for (Shape shape : shapes) {
double area = switch (shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.width() * r.height();
case Square s -> s.side() * s.side();
// 不需要default分支,因为所有情况都已覆盖
};
System.out.println(shape + " 面积: " + area);
}
}
性能优势:
instanceof检查的开销适用场景:
特性说明:
语法格式:
return switch (对象) {
case 类型 变量名 -> 表达式;
case 类型 变量名 -> 表达式;
case null -> 表达式;
default -> 表达式;
};
代码示例:
// 使用模式匹配的switch表达式
private static String describeObject(Object obj) {
return switch (obj) {
case String s -> "字符串: " + s;
case Integer i -> "整数: " + i;
case Double d -> "浮点数: " + d;
case Circle c -> "圆形, 半径: " + c.radius();
case null -> "空对象";
default -> "未知类型: " + obj.getClass().getSimpleName();
};
}
// 测试模式匹配switch
public static void demonstratePatternMatchingSwitch() {
System.out.println("n=== 模式匹配switch示例 ===");
Object[] objects = {
"Hello",
42,
3.14,
new Circle(2.0),
null,
new int[]{1, 2, 3}
};
for (Object obj : objects) {
String description = describeObject(obj);
System.out.println(description);
}
}
性能优势:
instanceof检查和类型转换适用场景:
特性说明:
核心组件:
RandomGenerator:随机数生成器接口RandomGeneratorFactory:随机数生成器工厂RandomGeneratorFactory.all():获取所有可用的随机数生成器算法代码示例:
public static void demonstrateRandomGenerator() {
System.out.println("n=== 新的随机数生成器API示例 ===");
// 获取所有可用的随机数生成器算法
RandomGeneratorFactory.all()
.map(factory -> factory.name() + " - " + factory.group())
.sorted()
.forEach(System.out::println);
// 创建特定算法的随机数生成器 - L64X256MixRandom是高性能算法
RandomGenerator l64X256Random = RandomGeneratorFactory.of("L64X256MixRandom")
.create();
// 生成随机数
System.out.println("n使用L64X256MixRandom生成随机数:");
for (int i = 0; i < 5; i++) {
System.out.println("随机数 " + (i + 1) + ": " + l64X256Random.nextInt(100));
}
// 与旧Random对比,新算法性能更优
Random legacyRandom = new Random();
System.out.println("n旧Random vs 新RandomGenerator:");
System.out.println("旧Random: " + legacyRandom.nextInt(100));
System.out.println("新RandomGenerator: " + l64X256Random.nextInt(100));
}
性能优势:
适用场景:
| 特性 | 性能提升 | 适用场景 |
|---|---|---|
| 密封类 | 编译器更积极的优化,减少类型检查开销 | 有限的继承层次、类型安全要求高的场景 |
| 模式匹配switch | 减少instanceof检查和类型转换开销 | 多类型处理、复杂条件判断 |
| 新随机数生成器API | 新算法比旧版Random快2-3倍,支持并行操作 | 大规模随机数生成、并发环境 |
| 移除实验性组件 | 减少JVM启动时间和内存占用 | 所有场景,特别是启动时间敏感的应用 |
| 外部函数和内存API | 更高效的本地代码和内存访问 | 与本地库交互、性能敏感的场景 |
| 向量API | 支持SIMD操作,提高数值计算性能 | 科学计算、图像处理、机器学习 |
sealed关键字限制子类permits子句指定允许的子类final、sealed或non-sealedinstanceof检查和类型转换case null分支package com.java.learning;
import java.util.random.RandomGenerator;
import java.util.random.RandomGeneratorFactory;
import java.util.*;
public class JDK17Features {
public static void main(String[] args) {
demonstrateSealedClasses();
demonstratePatternMatchingSwitch();
demonstrateRandomGenerator();
}
public static void demonstrateSealedClasses() {
System.out.println("=== 密封类示例 ===");
// 创建不同形状的实例
List<Shape> shapes = List.of(
new Circle(5.0),
new Rectangle(4.0, 6.0),
new Square(3.0)
);
// 处理形状
for (Shape shape : shapes) {
double area = switch (shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.width() * r.height();
case Square s -> s.side() * s.side();
// 不需要default分支,因为所有情况都已覆盖
};
System.out.println(shape + " 面积: " + area);
}
}
public static void demonstratePatternMatchingSwitch() {
System.out.println("n=== 模式匹配switch示例 ===");
Object[] objects = {
"Hello",
42,
3.14,
new Circle(2.0),
null,
new int[]{1, 2, 3}
};
for (Object obj : objects) {
String description = describeObject(obj);
System.out.println(description);
}
}
// 使用模式匹配的switch表达式
private static String describeObject(Object obj) {
return switch (obj) {
case String s -> "字符串: " + s;
case Integer i -> "整数: " + i;
case Double d -> "浮点数: " + d;
case Circle c -> "圆形, 半径: " + c.radius();
case null -> "空对象";
default -> "未知类型: " + obj.getClass().getSimpleName();
};
}
public static void demonstrateRandomGenerator() {
System.out.println("n=== 新的随机数生成器API示例 ===");
// 获取所有可用的随机数生成器算法
RandomGeneratorFactory.all()
.map(factory -> factory.name() + " - " + factory.group())
.sorted()
.forEach(System.out::println);
// 创建特定算法的随机数生成器 - L64X256MixRandom是高性能算法
RandomGenerator l64X256Random = RandomGeneratorFactory.of("L64X256MixRandom")
.create();
// 生成随机数
System.out.println("n使用L64X256MixRandom生成随机数:");
for (int i = 0; i < 5; i++) {
System.out.println("随机数 " + (i + 1) + ": " + l64X256Random.nextInt(100));
}
// 与旧Random对比,新算法性能更优
Random legacyRandom = new Random();
System.out.println("n旧Random vs 新RandomGenerator:");
System.out.println("旧Random: " + legacyRandom.nextInt(100));
System.out.println("新RandomGenerator: " + l64X256Random.nextInt(100));
}
}
// 密封类和接口定义
// 密封接口 - 只允许指定的类实现
sealed interface Shape permits Circle, Rectangle, Square {
String name();
}
// 密封类 - 只允许指定的类继承
sealed class AbstractShape permits Circle, Rectangle, Square {
private final String color;
public AbstractShape(String color) {
this.color = color;
}
public String getColor() {
return color;
}
}
// 最终类 - 不能再被继承
final class Circle extends AbstractShape implements Shape {
private final double radius;
public Circle(double radius) {
this(radius, "red");
}
public Circle(double radius, String color) {
super(color);
this.radius = radius;
}
public double radius() {
return radius;
}
@Override
public String name() {
return "Circle";
}
@Override
public String toString() {
return String.format("Circle(radius=%.2f, color=%s)", radius, getColor());
}
}
// 非密封类 - 可以被任意继承
non-sealed class Rectangle extends AbstractShape implements Shape {
private final double width;
private final double height;
public Rectangle(double width, double height) {
this(width, height, "blue");
}
public Rectangle(double width, double height, String color) {
super(color);
this.width = width;
this.height = height;
}
public double width() {
return width;
}
public double height() {
return height;
}
@Override
public String name() {
return "Rectangle";
}
@Override
public String toString() {
return String.format("Rectangle(width=%.2f, height=%.2f, color=%s)",
width, height, getColor());
}
}
// 最终类
final class Square extends AbstractShape implements Shape {
private final double side;
public Square(double side) {
this(side, "green");
}
public Square(double side, String color) {
super(color);
this.side = side;
}
public double side() {
return side;
}
@Override
public String name() {
return "Square";
}
@Override
public String toString() {
return String.format("Square(side=%.2f, color=%s)", side, getColor());
}
}
JDK 17作为长期支持(LTS)版本,引入了多项重要特性和性能改进,为Java开发者带来了更好的开发体验和性能表现。从密封类到模式匹配switch,从新随机数生成器API到外部函数和内存API,这些特性不仅使代码更简洁、更安全,还显著提升了应用程序的性能。
通过合理使用JDK 17的新特性,开发者可以:
JDK 17的发布标志着Java平台的持续演进,为Java在现代应用开发中保持竞争力奠定了基础。对于企业应用和长期项目,升级到JDK 17可以获得更好的性能、更丰富的功能和更长的支持周期,是一个值得考虑的选择。
此外,JDK 17中的预览特性也为未来版本的发展指明了方向,开发者可以通过关注这些特性,为未来的Java版本做好准备,保持技术的先进性。