一.前言
从springboot3.0开始,已经不⽀持JDK8了。
从3.0开始,转变为JDK17。
官⽅维护的版本都是SpringBoot3.X的了,但是之前的版本也是可以⽤的,只是官⽅不再进⾏功能更新了。
综上所述,选⽤Java17,概括起来主要有下⾯⼏个主要原因:
1. JDK17是LTS(⻓期⽀持版),可以免费商⽤到2029年。⽽且将前⾯⼏个过渡版(JDK9-JDK16)
去其糟粕,取其精华的版本;
2. JDK17性能提升不少,⽐如重写了底层NIO,⾄少提升10%起步;
3. ⼤多数第三⽅框架和库都已经⽀持,不会有什么⼤坑;
二.一些新增的特性
2.1 yield关键字:
yield关键字,从Java13开始引⼊。yield关键字⽤于从case的代码块中返回值。
正常的switch语句。
简化后的switch语句
如果不想使⽤指向符->可以使⽤yield来代替:
2.2 var关键字
从Java10开始,var被引⼊
他会根据后面的东西来判断类型。
为什么使⽤var?
使⽤var可以使代码更简洁。有时候,类型名称可能会⾮常⻓,例如泛型。var就像是⼀个简化器,让你不必反复写出繁琐的类型名。
可以直接用var代替。
使⽤注意事项:
1. 不能使⽤var来声明字段。
也就是不能声明成员变量。
2. 不能使⽤var来声明⽅法参数。
3. 不能使⽤var来声明⽅法返回类型。
4. var声明变量必须初始化,但是不能初始化为null。
它无法通过null来判断类型。
2.3 密封类
密封类⼀般应⽤在类和接⼝中,对接⼝和类的实现和继承进⾏约束。主要使⽤的关键字是 final 。当这个类被 final 修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承。
JDK17提供了⼀个新的关键字: sealed .密封类除了可以被该关键字修饰,并且在声明末尾⽤
permits 表⽰要开放给哪些类型。
sealed关键字
为什么报错呢?
原因就是:被sealed修饰的必须有子类。
上面不报错了下面报错了。
原因就是,简单来说就是继承了sealed类,子类必须被sealed,non-sealed,final其中一个修饰。
用sealed修饰的话dog还得有子类。
用这两个关键字修饰就不需要再被继承了,用non-sealed修饰,其他类还可以继承dog类,但是用final修饰的话,其他类则无法继承dog类,dog类就无法作为子类了。
permits关键字
permits要结合sealed使用,无法单独使用。
此时用了permits关键字的话,表示Anminal类只能被dog类继承,其他类无法继承。
如果想要cat继承,就在dog后面加上cat即可。
Java8,接可以有默认⽅法。Java9之后,可以在接⼝内实现私有⽅法实现。
2.4 接口的私有方法
接口原本只有default才能有方法体,Java8之后,私有方法也可以有方法体了。
2.5 instanceof
我们常见的
上⾯的instancof语法⼀共做了三件事:
1. 判断是否为String类型;
2. 如果是,转成String类型;
3. 创建⼀个名为str的临时变量;
可能有人会有疑惑,既然它都是String类型了为什么还要强转。
下面是一个例子
Object类型的变量中什么都可以放,但是他不是一个纯正了String类型,虽然通过instanceof判断的是String类型,但是它仍然需要强制类型转换,类似于向下转型。
在JDK16中,使⽤模式匹配思想改进了instanceof⽤法,可以做到以下优化效果:
2.6 其他
其他还有很多,就不一一列举了,只列举一些常用的。
不常用的还有
1. ZGC-新⼀代垃圾回收器、G1垃圾回收器相关等等。
2. record类的使⽤。
3. StreamAPI的部分改进。
4. HttpClient 重写了,⽀持HTTP2.0。
5. ⽀持List.of()、Set.of()、Map.of()和Map.ofEntries()等⼯⼚⽅法实例化对象。
三.结束语
感谢大家的查看,希望可以帮助到大家,做的不是太好还请见谅,其中有什么不懂的可以留言询问,我都会一一回答。 感谢大家的一键三连。