jdk8新特性:
1、lambda表达式
2、引入了stream api
3、函数式接口
4、方法引用 ::
5、hashmap实现的增强
6、Optional类
7、对时间、日期的优化,新增了LocalDate、LocalTime、LocalDateTime,打印输入时比date友好。
5、并发增强:JDK 8对并发编程进行了增强。它引入了一些新的并发工具和类,使得并发编程更加容易和有效。其中包括CompletableFuture类、StampedLock类、并行数组等。这些增强使得开发人员能够更好地处理并发问题,提高程序的性能和可伸缩性。
jdk17新特性:
1、switch表达式
int num = 5;
int square = switch (num) {case 1, 2, 3 -> num;default -> num * num;
};
System.out.println(square);
2、ZGC
JDK 17 中对 ZGC(可伸缩的低延迟垃圾回收器)进行了一些改进,其中包括了针对 MappedByteBuffer 和堆外内存的改进,使得它们可以更快地进行垃圾回收,提高了应用程序的性能。
3 JDK 17 中引入了一个统一的 JVM 日志系统,它可以在运行时收集并记录 JVM 和应用程序的日志信息,并支持按时间戳、等级和线程 ID 等进行筛选和过滤,以帮助开发人员更轻松地调试和分析应用程序的运行情况。
4、空指针会报出具体的对象
5、引入文本块
三个引号
// jdk1.8的写法
String html = "<html>\n" +" <head>\n" +" <title>test</title>\n" +" </head>\n" +" <body>\n" +" <h1>test</h1>\n" +" </body>\n" +" </html>\n";
// jdk13的写法
var jdk15Html = """<html><body><p>hello, world</p></body></html>""";
6、封闭类
Sealed Classes(封闭类)
// 测试代码
public sealed class Car permits MiniCar, SmallCar, Bigcar{...
}
// 以下代码可以正常运行
public final class MiniCar extends Car {...}
// 以下代码会报错
public final class Train extends Car {...}
7、Record类型
record 是 JDK 14 引入的关键字,用于声明不可变的数据类。它适用于存储纯粹的值类型数据.编译后的字节码被final修饰且继承Record类,所有属性也都被final修饰。
可以直接获取属性,point.x(),不能set
使用:
public record point(int x,int y){
8、instanceof类型判断再也不需要强制转换
原:
if(obj instanceOf String){
String str = (String) obj;}
现在:
if(obj instance String str){}
在instanceOf的同时将obj强制转换并赋值给str。
为什么要升级到jdk17
最简单的理由就是,springboot3.0放弃了jdk8,kafka4.0同样放弃了jdk8
其次是垃圾回收器的效率都提升了,最大的亮点是带来了稳定版的ZGC垃圾回收器,达到亚毫秒级停顿。
1、ZGC垃圾回收器从实验性功能更改为正式产品功能,从JDK11引入以来,经过持续的迭代升级,目前已经足够稳定。需要手动开启,开启方式:-XX:+UseZGC
2、G1垃圾回收器仍然作为默认垃圾回收器,进行改进升级,主要包括可中止的混合收集集合、NUMA 可识别内存分配等
3、JDK14开始删除CMS垃圾回收器
4、JDK14开始弃用 ParallelScavenge 和 SerialOld GC 的组合使用
升级时,将springBoot升级到2.7.14, Spring升级到5.3.29
升级过程中出现的问题:
主要是一些找不到类的问题,
1、在编译时会找不到相关的类。这是因为 Java EE 已经在 Java 9 中被标记为 deprecated,Java 11 中被正式移除,可以手动引入 javax 的包
2、lombok找不到找不到包,升级一下版本