JDK | 版本 - [8 -> 21 主要更新内容]
§1 说明
官方提供的各个 jdk 版本新特新的文档,如
-
https://docs.oracle.com/javase/9/whatsnew/toc.htm
-
https://openjdk.org/projects/jdk/11/
阅读难度略大,且信息分散,下述内容在已有总结的基础上进行梳理
§2 明细
|
JKD
|
NO
|
性质
|
SUMMARY
|
说明
|
|
9
|
1
|
架构
|
模块化
|
|
|
2
|
语法
|
<> 增强
|
匿名内部类可以使用 <>
|
|
|
3
|
语法
|
try-with-resource 增强
|
可以释放外部声明的等效 final 变量
|
|
|
4
|
语法
|
单独 _ 不能作为标识符
|
|
|
|
5
|
语法
|
接口中可以有 private 方法
|
此时接口中允许的成员包括:静态常量 / 抽象方法 / 默认方法(default)/ 静态方法 / 私有方法
|
|
|
6
|
性能
|
String 底层存储
|
char[] -> byte[],jdk 认为大部分数组中只有 latin-1 字符,为提高新能
|
|
|
7
|
api
|
stream api 增强
|
新增 takeWhile / dropWhile / ofNullable / iterate(重载)
|
|
|
8
|
api
|
InputStrean api 增强
|
新增 transferTo,快速转输出流
|
|
|
9
|
api
|
只读集合增强
|
List.of(ele1,ele2,ele3);
|
|
|
10
|
api
|
Optional api 增强
|
ifPresentOrElse / or / stream
|
|
|
11
|
工具
|
jshell
|
类似 bash,里面可以直接使用 java 的 api
|
|
|
10
|
1
|
语法
|
局部变量类型推断(var)
|
var List = new ArrayList(); var = variable,限制颇多,完全不建议用
|
|
2
|
api
|
只读集合增强
|
List.copyOf(otherList);
|
|
|
3
|
api
|
Optional api 增强
|
orElseThrow
|
|
|
11
|
1
|
语法
|
var 增强
|
lamda 中可以配合注解使用
|
|
2
|
api
|
String api 增强
|
isBlank / strip / stripTrailin / stripLeading / repeat / lines().count()
|
|
|
3
|
api
|
Optional api 增强
|
isEmpty
|
|
|
4
|
api
|
jdk 9 开始引入,11 正式可用
|
||
|
5
|
工具
|
java 命令行增强
|
新语法 java A.java,以前只能 javac A.java -> java A
|
|
|
6
|
GC
|
ZGC(预览)
|
|
|
|
7
|
底层
|
对 unicode10 的支持
|
unicode 与 UTF 的关系
|
|
|
12
|
1
|
语法
|
switch 增强(预览)
|
switch 语句,对 -> 的支持,可以防穿透,因此免 break
|
|
2
|
api
|
NumberFormat 增强
|
增加对人类友好短格式的支持,1000 -> 1k
|
|
|
3
|
api
|
String 增强
|
transform(Function) / indent (调整缩进)
|
|
|
4
|
api
|
Files 增强
|
mismatch 对比差异
|
|
|
5
|
GC
|
Shenandoah GC(预览)
|
|
|
|
5
|
GC
|
G1 增强
|
Collection set 拆分 mandatory、optional,完成mandatory 后,gc 即为可中断状态
|
|
|
6
|
GC
|
G1 增强
|
按系统负载,决定是否进行定期垃圾回收,如果回收,可以触发 FullGc,并可能释放 java 堆给系统
|
|
|
7
|
api
|
ConstantDesc/Constable
|
大致意思是不直接使用 public static final,而是将其包装为 ConstantDesc,并加入 jvm 常量池
|
|
|
8
|
测试
|
JMH
|
性能测试工具,结合 maven 会在构建时多生成一个独立的 jar 用于方法级性能测试
|
|
|
9
|
底层
|
ARM64端口只保留aarch64 实现
|
arm64 是一种 64 位微处理器架构,和他对等的是x86_64架构,不同架构支持的指令集会有区别
适配 ARM64 的 jdk 有两套:oracle 的 arm64, open 的 aarch64,jdk12 里把前者拆了,只留了后者
|
|
|
10
|
底层
|
默认开启 CDS
|
CDS = Class-Data Sharing,jdk 5 引入,用于一个物理机/虚拟机上启动多个 jvm 时
使这些 jvm 直接可以共享核心类的装载,而不需要每个 jvm 独立加载所有类,但是需要手动配置开启
|
|
|
11
|
底层
|
对 unicode11 的支持
|
|
|
|
13
|
1
|
语法
|
switch 增强(预览)
|
switch 语句,对 yield 的支持,其实就是一种防呆语法,语法逻辑没有变更
|
|
2
|
语法
|
文本块(预览)
|
用一对 """ 包裹(必须折行),类似 CDATA 区,可读性较强
|
|
|
3
|
api
|
Socket api 重写
|
NioSocketImpl
|
|
|
4
|
GC
|
ZGC 增强
|
可以将未使用的内存还给操作系统,会调整堆大小
|
|
|
5
|
底层
|
默认开启 CDS
|
允许 JVM 在启动后动态归档类元数据
|
|
|
14
|
1
|
语法
|
instanceof 增强(预览)
|
instanceof-and-cast 语法:obj instanceof AClazz aclz,然后直接使用 aclz 变量,此变量即 AClazz 类型
|
|
2
|
语法
|
switch 增强(正式)
|
就是正式确认了之前的增强
|
|
|
3
|
语法
|
文本块(预览)
|
增加了对常见格式的支持,xml、json等
|
|
|
4
|
语法
|
record
|
相当于用 javaBean 的全参构造器代替声明这个javaBean,代价是其对象不能修改
本质是所有字段都 final 的 final 类
|
|
|
5
|
GC
|
G1 增强
|
NUMA(非统一内存访问架构)增强
|
|
|
6
|
GC
|
GC 组合弃用
|
Serial+CMS,ParNew+Serial Old
|
|
|
7
|
GC
|
cms 移除
|
|
|
|
8
|
GC
|
ZGC 增强
|
支持 windows 、mac
|
|
|
9
|
底层
|
NPE 增强
|
会在异常信息里明确具体什么东西 null 了
|
|
|
15
|
1
|
语法
|
sealed class(预览)
|
密封类,限制子类,不允许指定之外的子类,约等于子类的枚举化 -> "莫挨老子代码"
|
|
2
|
语法
|
hidden class
|
隐藏类,不能被其他 class 直接只用,只能反射
|
|
|
3
|
语法
|
record(预览)
|
增强部分内部功能,包括默认实现的方法
|
|
|
4
|
语法
|
文本块(正式)
|
|
|
|
5
|
GC
|
ZGC(正式)
|
|
|
|
6
|
性能
|
禁用偏向锁
|
偏向锁其实就是一种有锁但是无竞争的特殊锁状态,正常情况下应该很短暂,但是有锁膨胀的成本
|
|
|
7
|
api
|
Socket api 重写
|
DatagramSocket
|
|
|
16
|
1
|
语法
|
sealed class(预览)
|
|
|
2
|
语法
|
instanceof 增强(预览)
|
|
|
|
3
|
语法
|
record(预览)
|
允许内部类作为记录的成员
|
|
|
4
|
api
|
Vector api(预览)
|
向量类
|
|
|
5
|
GC
|
ZGC 增强
|
对线程栈的处理从安全点移动至并发阶段
|
|
|
6
|
底层
|
C++ 14 特性支持
|
在 java 底层使用 C++ 14 的特性
|
|
|
7
|
底层
|
弹性元空间
|
现在 jvm 会将没有用到的元空间返还给操作系统
|
|
|
8
|
底层
|
对 jdk 内部元素进行强封装
|
未通过模块化导出的所有元素都视为内部元素,禁止访问,包括通过反射访问
|
|
|
17
|
1
|
语法
|
sealed class(正式)
|
|
|
2
|
语法
|
switch 增强(预览)
|
模式匹配:在同一个 switch 表达式中,支持 Object 入参,相当于支持基于类型的分支判断
|
|
|
3
|
语法
|
浮点增强
|
浮点计算回归严格语义,strictfp 关键字失效。非严格语义的浮动计算省资源,但不同机器运算结果可能不同
|
|
|
4
|
api
|
随机类增强
|
RandomGenerator
|
|
|
5
|
api
|
Vector api(预览)
|
|
|
|
6
|
api
|
FFM API(预览)
|
外部函数和内存 API ,如 MemorySegment、SymbolLookup 等,在 jdk.incubator.foreign 包中
对应原 JNI 机制,ByteBuffer、Unsafe 类
|
|
|
7
|
底层
|
AOT/JIT 移除
|
提前编译与即时编译工具,实测自诞生以来没啥用,删了 但是同步推出的 GraalVm for JDK 17 一个宣传点就是 AOT/JIT
|
|
|
18
|
1
|
语法
|
javadoc 增强
|
支持语法高亮
|
|
2
|
语法
|
switch 增强
|
模式匹配增强,支持 null
|
|
|
3
|
api
|
Vector api(预览)
|
|
|
|
4
|
api
|
FFM API(预览)
|
|
|
|
5
|
api
|
互联网地址解析SPI
|
java.net.InetAddress 可以通过 spi 注入外部解析器
|
|
|
6
|
性能
|
反射增强
|
api 不变,但是提升性能
|
|
|
7
|
工具
|
jwebserver 命令
|
jdk 内置精简 web 服务器,不支持 CGI 和 Servlet(所有不知道这有啥用)
|
|
|
8
|
底层
|
默认使用 UTF-8 编码
|
|
|
|
19
|
1
|
语法
|
Record Patterns(预览)
|
instanceof 增强与 record 结合后的语法,形如
obj instanceof Point(int x, int y) |
|
2
|
语法
|
switch 增强
|
模式匹配
|
|
|
3
|
api
|
FFM API(预览)
|
|
|
|
4
|
api
|
Virtual Thread(预览)
|
Thread.ofVirtual(),以及虚拟线程池 Executors.newVirtualThreadPerTaskExecutor()
|
|
|
5
|
api
|
Vector api(预览)
|
|
|
|
6
|
api
|
结构化并发(预览)
|
StructuredTaskScope,强调任务之间的关联
同时被提交的任务应该随着提交方一起终结,以避免提交方终结后,被提交的任务还在执行且相互关系更晦暗
|
|
|
20
|
1
|
语法
|
Record Patterns(预览)
|
|
|
2
|
语法
|
switch 增强(预览)
|
模式匹配
|
|
|
3
|
api
|
scoped values(预览)
|
相当于改进版的 ThreadLocal,可以在不同线程(含虚拟线程)之间复用形参
不同线程之间,形参相互独立,且其值不可变
|
|
|
4
|
api
|
FFM API(预览)
|
|
|
|
5
|
api
|
Virtual Thread(预览)
|
|
|
|
6
|
api
|
结构化并发(预览)
|
|
|
|
7
|
api
|
Vector api(预览)
|
|
|
|
21
|
1
|
语法
|
Record Patterns(正式)
|
|
|
2
|
语法
|
switch 增强(正式)
|
|
|
|
3
|
语法
|
匿名模式/值(预览)
|
当不关心值具体是什么的时候,用 _ 代表一个模式或者值
|
|
|
4
|
语法
|
匿名类实例main方法(预览)
|
出于教学目的,个人认为不需要关注。程序入口以前只能是类的静态 main 方法
现在允许非静态 main 方法,并在静态 main 中实例化主类,并调用实例的 main
|
|
|
5
|
api
|
FFM API(预览)
|
|
|
|
6
|
api
|
Virtual Thread(正式)
|
到此以前的线程被归类为平台线程,与虚拟线程相对
n 多根虚拟线程对应一根平台线程,对应一根内核线程
虚拟线程的原理实在 jvm 内部实现虚拟线程调度,而不是有操作系统完成,因此不需要上下文切换
|
|
|
7
|
api
|
scoped values(预览)
|
|
|
|
8
|
api
|
字符串模板(预览)
|
String name = "zou"; String say = STR."Hello \{name}"; |
|
|
9
|
api
|
有序集合(预览)
|
Sequenced Collections,有序、高性能、线程安全的集合
|
|
|
10
|
api
|
Vector api(预览)
|
|
|
|
11
|
api
|
结构化并发(预览)
|
|
|
|
12
|
api
|
秘钥封装 api
|
KeyEncapsulationMechanism
|
|
|
13
|
GC
|
分代 ZGC
|
但实际提升有人测过只 10%
|
|
|
14
|
底层
|
准备禁用动态agent加载(预览)
|
-Djdk.attach.allowAttachSelf=false |
|
|
|
|
|
|
|

浙公网安备 33010602011771号