一分钟掌握 Java21 新特性
1. 虚拟线程(Virtual Threads)
虚拟线程是 Java 21 引入的一项重要特性,旨在简化并发编程。虚拟线程是轻量级的线程,可以在 JVM 中创建成千上万的虚拟线程,而不会消耗大量的系统资源。
示例代码:
import java.util.concurrent.Executors;public class VirtualThreadsDemo {public static void main(String[] args) {var executor = Executors.newVirtualThreadPerTaskExecutor();for (int i = 0; i < 100; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is running on " + Thread.currentThread().getName());});}executor.shutdown();}
}
解释:
- 使用
Executors.newVirtualThreadPerTaskExecutor()
创建一个虚拟线程的执行器。 - 提交了 100 个任务,每个任务在一个虚拟线程中运行。
- 虚拟线程的创建和切换开销较小,适合高并发场景。
2. 记录模式(Record Patterns)
记录模式允许在模式匹配中直接解构记录类型(record type),使得代码更加简洁和可读。
示例代码:
record Point(int x, int y) {}public class RecordPatternsDemo {public static void main(String[] args) {Object obj = new Point(10, 20);if (obj instanceof Point(int x, int y)) {System.out.println("Point coordinates: x = " + x + ", y = " + y);}}
}
解释:
- 定义了一个记录类型
Point
,包含字段x
和y
。 - 使用模式匹配直接解构
Point
对象,提取字段值。 - 这种方式比传统的类型检查和强制转换更加简洁,提高了代码可读性。
3. 序列化增强(Serialization Enhancements)
Java 21 对序列化机制进行了增强,提供了更好的性能和安全性。
示例代码:
import java.io.*;class User implements Serializable {private String name;private transient String password;public User(String name, String password) {this.name = name;this.password = password;}@Overridepublic String toString() {return "User{name='" + name + "', password='" + password + "'}";}
}public class SerializationDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {User user = new User("Alice", "secret");// 序列化try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"))) {oos.writeObject(user);}// 反序列化User deserializedUser;try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"))) {deserializedUser = (User) ois.readObject();}System.out.println("Deserialized User: " + deserializedUser);}
}
解释:
User
类实现了Serializable
接口,支持序列化。password
字段被标记为transient
,在序列化时不会被保存。- 提高了安全性,敏感数据不会被存储。
4. 外部函数和内存(Foreign Function & Memory API)
Java 21 提供了对外部函数和内存的支持,使得 Java 可以更方便地调用 C/C++ 代码,并直接操作内存。
示例代码:
import jdk.incubator.foreign.*;public class ForeignFunctionDemo {public static void main(String[] args) {// 使用外部内存 APIMemorySegment segment = MemorySegment.allocateNative(4);segment.set(ValueLayout.JAVA_INT, 0, 42);System.out.println("Value in foreign memory: " + segment.get(ValueLayout.JAVA_INT, 0));segment.close(); // 释放内存}
}
解释:
- 使用
MemorySegment
分配和操作外部内存。 - 在外部内存中存储整数值,并成功读取。
- 使得 Java 可以与其他语言进行交互,适用于性能要求高的场景。
总结
Java 21 引入的这些新特性极大地增强了语言的表达能力和性能,尤其是在并发编程和与其他语言的互操作性方面。通过这些新特性,开发者可以编写出更简洁、高效和安全的代码。希望以上的示例和解释能够帮助你更好地理解 Java 21 的新特性!