java 语法类新特性总结
1. jdk 的泛型擦除时机,jdk17的新特性,interface 的默认修饰符?
编译期处理:Java泛型主要在编译阶段进行处理。编译器会检查类型安全,并插入必要的类型转换代码。但是,在生成的字节码中,所有的泛型类型信息都会被移除或替换为其上限类型
2.interface 的默认修饰符为protected
3. jdk 的新特性
JDK 10 (2018年3月)
- 局部变量类型推断:使用
var
关键字进行局部变量类型的自动推断。 - 改进的垃圾回收器:包括G1垃圾回收器的改进以及实验性的ZGC。
JDK 11 (2018年9月, LTS)
- 长期支持(LTS):作为自JDK 8以来的又一个长期支持版本。
- 移除Nashorn引擎和CORBA模块:为了减少JDK的体积和复杂性。
- Epsilon垃圾回收器:一种无操作(NoOp)的垃圾回收器。
JDK 12 (2019年3月)
- Switch表达式:作为一个预览特性被引入。
- Shenandoah GC:低暂停时间的垃圾收集器。
- JVM常量API:提供了一个新的API来读取和操作JVM常量池中的常量。
JDK 13 (2019年9月)
- 文本块(Text Blocks):多行字符串字面量的支持,作为预览特性首次亮相。
JDK 14 (2020年3月)
- 记录(Records):作为预览特性被引入,简化了数据载体类的定义。
- 模式匹配(Pattern Matching):对于
instanceof
进行了增强,作为预览特性。
JDK 15 (2020年9月)
- 密封类(Sealed Classes):成为预览特性的一部分,限制了哪些类可以扩展或实现它们。
JDK 16 (2021年3月)
- Pattern Matching for instanceof:成为了标准特性而非预览状态。
- 其他语言和库的增强:如对Vector API的迭代发展等
JDK 17 (2021年9月, LTS)
一、语言特性增强
密封类(Sealed Classes)
- 通过
sealed
和permits
关键字限制类的继承层级,增强类型安全性和代码可维护性。 - 示例:
public sealed class Shape permits Circle, Rectangle {} final class Circle extends Shape {}
- 通过
文本块(Text Blocks)
- 支持多行字符串,使用三重引号(
"""
)包裹,简化 HTML、SQL 等代码编写,减少转义字符。 - 示例:
String html = """<html><body>Hello, World!</body></html>""";
- 支持多行字符串,使用三重引号(
Switch 表达式增强
- 支持模式匹配和
yield
返回值,简化复杂条件判断。 - 示例:
int result = switch (obj) { case String s -> s.length(); case Integer i -> i * 2; default -> 0; };
- 支持模式匹配和
模式匹配的
instanceof
- 类型检查与赋值合并,减少冗余代码。
- 示例:
if (obj instanceof String s) { System.out.println(s.toUpperCase()); }
记录类(Records)
- 声明不可变数据载体类,自动实现构造器、
toString()
、equals()
和hashCode()
。 public record Point(int x, int y) {} var p = new Point(1, 2);
- 声明不可变数据载体类,自动实现构造器、
二、性能与 GC 优化
ZGC 改进
- 低延迟垃圾回收器,停顿时间不超过 10ms,支持动态堆内存扩展(-XX:+ZDynamicMemory),适用大规模应用。
- 在 Linux/x64 平台成为默认 GC(替代 G1)。
JIT 编译器优化
- 提升热点代码编译效率,降低运行时开销。
内存管理增强
- 引入外部函数和内存 API(孵化),安全高效调用本地代码。
三、安全与工具改进
强封装内部 API
- 默认禁止反射访问
sun.*
等非公开类,需通过--add-opens
显式授权,增强安全性。
- 默认禁止反射访问
TLS 1.3 支持
- 加密协议升级,提供更安全的网络通信。
弃用 RMI 激活机制
- 移除过时功能,简化平台维护。
JDK 18 (2022年3月)
- Vector API:进入早期访问阶段。
- UTF-8 by Default:默认字符集改为UTF-8。
JDK 19 (2022年9月)
- Virtual Threads:轻量级线程,作为预览特性。
- Foreign Function & Memory API:允许Java程序调用外部函数并安全地访问外部内存。
JDK 20 (2023年3月)
- Foreign Function & Memory API:继续走向成熟。
- Virtual Threads:第二预览版。
JDK 21 (2023年9月, LTS)
- 更多关于泛型和模式匹配方面的探索。
- Foreign Function & Memory API:可能成为正式特性
JDK 22 (2024年3月发布)
- G1垃圾收集器的区域固定(Region Pinning):减少垃圾回收过程中的停顿时间,提高系统性能。
- 构造函数中
super()
之前的语句(预览版):允许在调用父类构造函数之前执行不引用当前实例的语句。 - 外来函数与内存API(Foreign Function & Memory API, FFM API):简化了Java与本地代码的互操作性,并提升了性能和安全性。
- 未命名变量与模式:允许开发者在不需要显式引用变量的情况下进行模式匹配。
JDK 23 (未详细提及具体的新特性,但可以推测有持续的改进和一些预览特性的更新)
JDK 24 (2025年3月发布)
- 提升启动性能:JEP 483提前加载和链接类:缩短Java应用程序的启动时间,通过让类在JVM启动时立即处于加载和链接状态。
- 流API的增强:JEP 485流收集器:扩展了流API的功能,提供更多的灵活性和效率。
- 作用域值(第四次预览):支持在线程内部和线程之间共享不可变数据,优于线程局部变量。
- 向量API(第九次孵化):继续优化高性能计算能力。
- 分代Shenandoah(实验性):提供了一种新的实验性分代模式,不影响非分代的Shenandoah垃圾回收器。
- 紧凑对象头(实验性):提议减少64位架构下HotSpot JVM中对象头的大小。
- 密钥派生函数API(预览):用于从初始密钥和其他数据派生额外密钥的加密算法。
- 永久禁用安全管理器:逐步移除安全管理器功能。
- 简单源文件和实例主方法(第四次预览):旨在帮助初学者更容易编写第一个程序。
- 结构化并发(第四次预览):将不同线程中运行的相关任务组视为单个工作单元,简化错误处理和取消操作
2. Java stream 的并发线程 的paralism?
java -Djava.util.concurrent.ForkJoinPool.common.parallelism=8 YourMainClass
ForkJoinPool forkJoinPool = new ForkJoinPool();
List<Integer> result = forkJoinPool.submit(()->IntStream.range(0, 100).parallel().map(i -> i * 2).boxed().collect(Collectors.toList())
).join();