一分钟掌握 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 ,包含字段 xy
  • 使用模式匹配直接解构 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;
    }

    @Override
    public 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) {
        // 使用外部内存 API
        MemorySegment 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 的新特性!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java&ly

感谢支持,请小编喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值